《小码农的十万个为什么!!!(一)》
《小码农的十万个为什么!!!(二)》
1.@Autowired 与@Resource的区别
原文很棒:
https://blog.csdn.net/weixin_40423597/article/details/80643990
@Resource的作用相当于@Autowired,只不过**@Autowired按byType自动注入**,而**@Resource默认按 byName自动注入**罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Resource装配顺序
1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
@Autowired 与@Resource的区别:
1、 @Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。
2、 @Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用,如下:
3、@Resource(这个注解属于J2EE的),默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
推荐使用:@Resource注解在字段上,这样就不用写setter方法了,并且这个注解是属于J2EE的,减少了与spring的耦合。这样代码看起就比较优雅。
2.Java中native关键字
参考《Java中native关键字》
native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问。
JNI是Java本机接口(Java Native Interface),是一个本机编程接口,它是Java软件开发工具箱(Java Software Development Kit,SDK)的一部分。JNI允许Java代码使用以其他语言编写的代码和代码库。Invocation API(JNI的一部分)可以用来将Java虚拟机(JVM)嵌入到本机应用程序中,从而允许程序员从本机代码内部调用Java代码。
JNI的书写步骤如下:
a.编写带有native声明的方法的Java类
b.使用javac命令编译编写的Java类
c.使用java -jni ****来生成后缀名为.h的头文件
d.使用其他语言(C、C++)实现本地方法
e.将本地方法编写的文件生成动态链接库
3.Java中的equals()和==比较
equals()是判断两个变量或者实例指向同一个内存空间的值是不是相同;
==是判断两个变量或者实例是不是指向同一个内存空间。
举个通俗的例子来说,双等 是判断两个人是不是住在同一个地址,而equals是判断同一个地址里住的人是不是同一个。
实例解析:
4.Mybatis获取实际执行的sql语句
有时候我们需要知道我们正在执行的sql是什么,或者将它写入日志,或者统计分析sql的执行时间,这里都会要求我们获取执行的SQL。
sqlSessionFactory该如何获取呢般的,如果配置了mybatis mapper 扫描器,就可以直接在代码中注入进来,即
@Autowired
private SqlSessionFactory sqlSessionFactory;
getConfiguration()
getMappedStatement()
getBoundSql()
5.NullPointerException异常但堆栈不打印,找不到具体哪一行/h2>
你或许遇到过日志打印的时候,只会提示一个空指针异常,但不会提示哪里的代码抛出了这个异常,导致我们不能很快定位问题所在。
问题原因:
这是虚拟机做的优化,堆栈信息给忽略了,如果想要打印出堆栈信息,需要在 java 虚拟机启动的时候加一个虚拟机参数,这个虚拟机参数是:
修改过后,果然打印出了堆栈信息,确定了是哪一行抛出的错,结合代码和数据最终修复了 bug 。
6.修改虚拟机参数/h2>
方式二:命令处理
java虚拟机可以使用JAVA_HOME/bin/java程序启动(JAVA_HOME为JDK的安装目录),
一般来说,java进程的命令使用方法如下:
java [-options] class [args…] ,[]代表可选
其中,-options 表示java虚拟机的启动参数,class 为带有main()方法的java类,args表示传递给主函数main()的参数.
实例:
运行结果:
7.@Reference 、@Resource和@Autowired的简单理解
(1)@Autowired
SpringBoot项目中常用。简单来说就是引入由Spring容器管理的bean。
(2)@Resource
作用相当于@Autowired,只不过@Autowired是byType自动注入,而@Resource默认byName自动注入。
(3)@Reference
@Reference是dubbo的注解,也是注入,他一般注入的是分布式的远程服务的对象,需要dubbo配置使用。
简单来说他们的区别:
@Reference注入的是分布式中的远程服务对象,@Resource和@Autowired注入的是本地spring容器中的对象。
8.@PostContruct和@PreDestroy
从Java EE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct和@PreDestroy,这两个注解被用来修饰一个非静态的void()方法。
(1)@PostContruct:
被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的inti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。
(2)@PreDestroy:
被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。
(3)执行顺序:
Constructor==>@Autowired==>postCo
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!