1.异同
相同点:两者都是用来注入bean的注解,在接口仅有一个实现类时,修饰效果相同,可以互相替换
不同点:@Resource是Java自己的注解,它有两个重要属性name和type,使用name属性按照byName自动注入策略,使用type属性则按照byType自动注入策略。两者都不适用默认采用byName自动注入策略。
@Autowired是spring的注解,在spring2.5之后引入,只能根据type进行注入,若接口实现类有多个则需要依赖@Qualifier或@Primary来进行区分。
2.大致原理:
在启动spring IoC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性
3.使用
@Autowired(修饰构造方法,set方法,属性值):
默认是按照byType进行注入的,如果发现多个bean,则按照byName方式对比,如果还是多个则报异常(使用required=false解决)
@Resource(属性或set方法)
在启动spring的时候,首先要启动容器;
启动spring容器时,会默认寻找容器扫描范围内的可加载bean,然后查找哪些bean上的属性和方法上有@Resource注解;
找到@Resource注解后,判断@Resource注解括号中的name属性是否为空,如果为空:看spring容器中的bean的id与@Resource要注解的那个变量属性名是否相同,如相同,匹配成功;如果不相同,看spring容器中bean的id对应的类型是否与@Resource要注解的那个变量属性对应的类型是否相等,若相等,匹配成功,若不相等,匹配失败。
如果@Resource注解括号中的name属性不为空,看name的属性值和容器中的bean的id名是否相等,如相等,则匹配成功;如不相等,则匹配失败。