@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 ...
随机推荐
- PHP+Mysql 实现数据库增删改查
PHP和Mysql可以对数据库进行简单的增删改查,本文介绍了新闻列表的后台管理. Mysql数据库创建 创建一个新闻列表的数据库: 1. 查询数据库 1.1. 创建文件dbconfig.php,保存常 ...
- C语言函数的格式
#include <stdio.h>#include <stdlib.h>extern int addf(int a,int b);//函数能多次声明//int addf(in ...
- 记录一下不能使用let时如何创建局部变量(使用立即执行函数)
记录一下阮老师提及的立即执行函数模拟let(以前根本没想到可以这样做啊!) // IIFE 写法 (function () { var tmp = ...; ... }()); // 块级作用域写法 ...
- C语言之各个位数上的数值之和
#include<stdio.h> #include<stdlib.h> void main() { int num; ; int x,y; printf("请输入一 ...
- JS获取登录者IP和登录城市
登录城市:<sp class="cy"></sp><br /> 管理员个数:<font color=</strong>< ...
- HDU 2174 Bridged Marble Rings
题目:Bridged Marble Rings 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2174 题意:如图,要把所有灰色球移动到上圈,每次操作可以转 ...
- 低版本Flume兼容高版本elasticsearch
Flume更新比较慢,而elasticsearch更新非常快所以当涉及更换elasticsearch版本时会出现不兼容问题. apache-flume-1.6.0+elasticsearch1.5.1 ...
- Oracle 12c CDB PDB 安装/配置/管理
Oracle安装参考:https://www.cnblogs.com/zhichaoma/p/9288739.html 对于CDB,启动和关闭与之前传统的方式一样,具体语法如下: STARTU ...
- MYSQL配置主从同步
MYSQL配置主从同步 mysql主服务器配置 vim /etc/my.cnf [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql. ...
- SPOJ DIVCNT2
SPOJ DIVCNT2 题目大意: 求\(S2(n)=\sum_{i=1}^{n}\sigma_0{(i^2)}\) . 题解 我们可以先考虑括号里只有一个\(i\)的情况,这样,我们把\(i\)分 ...