一、@Resource与@Autowired的区别?
1.@Autowired按byType自动注入。具体工作原理如下:
1、根据类型(byType)找到所有满足条件的bean
2、判断bean长度,如果没有,则根据@Autowired中的required属性进行判断是否抛出异常(默认为true)
3、如果多于一个,则尝试寻找最优的那一个,如果最优的未找到,则抛出异常
4、如果只有一个,则直接使用此bean
2.@Resource默认按byName自动注入。具体工作原理如下:
1、获取名称,判断容器中是否存在此name(id)的bean
2、如果存在,则直接使用此name进行查询
3、@Resource如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。
4、退化到默认的autowire查找方式
但是@Resource有两个属性是比较重要的,分是name和type;
如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略;
@Autowired是spring自己定义的注解,@Resource是J2EE的,由JSR-250规范定义。
二、@Autowired、@Resource与default-autowire="byType"、default-autowire="byName"有什么关系呢?
确切的说,没有什么关系。
Annotation注入和autowire是没有关系的。
Autowire的功能是在application context里实现的,
而annotation注入的功能是通过BeanPostProcessor来实现的。无论你是否autowire,只要你写了@Resource或@Autowired注解,对象就会被注入。