@Autowired和@Resource注解的一个意外重要区别
今天上午,因为公司要跟客户展示最近开发的项目,然后安排了我重新构建一个template项目,用来向客户展示参考。基于已开发好的代码,我在进行一些简化抽取的时候出现了一个有趣的问题
因为我们有一个spring security配置类时需要每个模块都使用,就是可能有些参数不同,现在我把他弄到一个公共的jar包,把之前类拷贝进去,然后把参数写活,结果出现了一些有意思的小问题,它源代码使用了@Resource注解,用来对一个不是返回bean的方法进行参数注入,父类有使用@Autowired注解
执行后发现执行顺序是:
1、先执行父类的构造
2、执行本类构造
3、执行本类有@Resource注解的方法
4、父类按顺序执行标有@Autowired的方法
5、执行子类标有的@Autowired方法
6、最后执行子类的重写方法
当时有点郁闷,郁闷的是@Resource注解标注的方法是在最下面,不仅比本类放在它上面的标有@Autowired方法的优先级高,还高于父类@Autowired的方法,反正这样的情况以前还真是从来没遇到过,一方面没怎么实际经历这种场景,另一方面我从来不用@Resouce注解
然后我试着在子类添加了一个方法加上了@PostConstructo注解,这个时候执行顺序和上面差不多,@PostConstructor标注的方法在上面第五条之后执行
然后我试着加上一个@Bean注解的方法,它的优先级还要低于@PostConstructor
最后把@Resouce注解改成了@Autowired,这个时候是先执行父类标有@Autowired的方法。得出一个结论,@Resource标注在方法上注入方法形参的时候,它会优先于父类及其本类所有标有@Autowired的注解先执行。代码这里就不贴了,有兴趣可以自己写写
最后结论
在@Configuration的配置类中标有@Resource、@Autowired这些的方法(必须要标注在方法上的情况下),会自动触发执行,且@Resource注解优先级高于@Autowired及其@PostConstructor,@PostConstructor优先级最低
如果想注入多个bean,@Autowired还可以按下面的方式用来注入多个,而@Resource只能标注在方法上面,且也只能在方法形参注入一个
@Autowired
public void testAutowiredAnon(AuthenticationManagerBuilder auth, @Autowired ApplicationContext ApplicationContext){
System.out.println("=========@Autowired testAutowiredAnon");
} @Resource
public void testResourceAnon(AuthenticationManagerBuilder auth){
System.out.println("=========@Resource testResourceAnon");
}
顺便温习下两个注解其他的区别
@Autowired默认byType匹配,默认情况下要求依赖的bean必须存在,如果依赖的bean可以没有,可以使用require=false,如果想byName匹配,需要配合@Qualifier注解指定其value值,value值就是beanName
@Resource默认byName匹配,没指定的话,它认为beanName是字段名,当找不到的会按照byType进行匹配,如果指定了name或type属性,它就会根据你指定的去找,没找到,抛出异常,@Resource不能放在方法的形参上,属于java jdk自带的注解
@Autowired和@Resource注解的一个意外重要区别的更多相关文章
- @Autowired 和 @Resource注解, 一个接口有多个实现类的时候Spring注入遇到的问题
先说下我遇到的问题,有一个接口 CompensationService, 有两个实现类 MusicCompensationStrategyImpl 和 TakeDeliveryCompensati ...
- Spring下的@Inject、@Autowired、@Resource注解区别(转)
1.@Inject javax.inject JSR330 (Dependency Injection for Java) 这是JSR330中的规范,通过AutowiredAnnotationBean ...
- Java框架spring 学习笔记(九):Spring的bean管理(@Required、@Component、@Autowired、@Resource注解)
注解:代码里面特殊的标记,使用注解可以完成相关功能 注解写法:@注解名称(属性名.属性值) @Required 用在set方法上,一旦用了这个注解,那么容器在初始化bean的时候必须要进行set,也就 ...
- @Autowired和@Resource注解的区别
@Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false.如果我们想使用按名称装配,可以结合@Qualifier注 ...
- 解决非controller使用,@Autowired或者@Resource注解注入Mapper接口为null的问题
知识点:在service层中注入其它的service接口或者mapper接口都是可以的 但是在封装的Utils工具类中或者非controller普通类中使用@Autowired@Resource注解注 ...
- 关于@Autowired和@Resource注解区别
区分一下@Autowired和@Resource两个注解的区别: 1.@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配 2.@A ...
- (转)用@Resource注解完成属性装配
http://blog.csdn.net/yerenyuan_pku/article/details/52858878 前面我们讲过spring的依赖注入有两种方式: 使用构造器注入. 使用属性set ...
- Spring5:@Autowired注解、@Resource注解和@Service注解
什么是注解 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点: 1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分 ...
- Spring中@Autowired注解、@Resource注解的区别
Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. @Resour ...
随机推荐
- MySQL工作原理
Mysql是由SQL接口,解析器,优化器,缓存,存储引擎组成的. mysql原理图各个组件说明: 1. connectors 与其他编程语言中的sql 语句进行交互,如php.java等. 2. M ...
- ansible roles
roles 特点 目录结构清晰 重复调用相同的任务 目录结构相同 web - tasks - install.yml - copfile.yml - start.yml - main.yml - t ...
- WordPress慢的八种解决方法(用排查法解决)
WordPress的打开速度慢会影响到用户体验和关键词的稳定排名,WordPress为什么加载慢呢?其实很简单的,就是WordPress水土不服,用WordPress的大家都知道,WordPress是 ...
- P5057 [CQOI2006]简单题
题目描述 有一个 n 个元素的数组,每个元素初始均为 0.有 m 条指令,要么让其中一段连续序列数字反转——0 变 1,1 变 0(操作 1),要么询问某个元素的值(操作 2). 例如当 n = 20 ...
- 在线SQL
有时候为了简单测试一下SQL语法,自己机器上没有安装,可使用在线的SQL环境. 我找到了两个: https://rextester.com/l/sql_server_online_compiler ( ...
- Xilinx FPGA 移位寄存器IP延时问题
软件版本:Vivado2016.1 在使用移位寄存器IP时,对于不同延时拍数的使能延时可能会有问题. (1)32深度的可变长度移位寄存器,IP生成界面如下图所示. (2)128深度的可变长度移位寄存器 ...
- SWIG 扩展Opencv python调用C++
osx:10.12 g++ 7.1 swig 3.0.12 opencv 3.2.0 SWIG是Simplified Wrapper and Interface Generator的缩写.是Pytho ...
- Python学习day17 迭代器&生成器
迭代器&生成器 1. 迭代器 1.1 迭代器 迭代:迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果.每一次对过程的重复称为一次"迭代" 迭代器:帮助对某种对象 ...
- Nginx+Keepalived搭建高可用负载均衡集群
本文的重点是Keepalived的配置,Nginx的配置就简略带过.软件:CentOS 7.2 / Nginx 1.12.2 / Keepalived 1.3.9 ha-01:192.168.1.97 ...
- java开发代码中的50个性能优化细节
在java程序中,性能的大部分原因并不在java与语言,而是程序本身.养成好的编码习惯非常重要,能够显著地提升程序性能. 1:尽量在合适的场合使用单例 使用单利可以减轻加载的负担,缩短加载时间,提高加 ...