Spring中@Autowired和@Resource注解的使用区别详解
作者:Sterne_
这篇文章主要介绍了Spring中@Autowired和@Resource注解的使用区别详解,@Autowired默认根据type进行注入,找到与指定类型兼容的 Bean 并进行注入,如果无法通过type匹配到对应的 Bean 的话,会根据name进行匹配,如果都匹配不到则抛出异常,需要的朋友可以参考下
1. @Autowired
@Autowired是由Spring提供的注解
@Autowired的bean的匹配规则
@Autowired默认根据type进行注入,找到与指定类型兼容的 Bean 并进行注入,如果无法通过type匹配到对应的 Bean 的话,会根据name进行匹配,如果都匹配不到则抛出异常。
- @Autowired 默认是按照类的类型去匹配。如果存在一个相同类型的bean,则注入该bean。
- 如果存在多个 bean,但只有一个 bean 拥有 @Primary 注解,则将带有 @Primary 注解的 bean 注入。@Primary 注解用于指定默认首选的 bean。
- 如果存在多个 bean,可以使用@Qualifier注解,配合该注解指定bean的具体名称,根据名称去识别bean。
- 如果存在多个 bean,可以使用 List 或 Set 数据结构来接收所有匹配的 bean。Spring 将自动将所有匹配的 bean 放入这些集合中。
- 如果存在多个 bean,没有配合上述的方案,则将抛出 NoUniqueBeanDefinitionException 异常。
@Autowired的required属性
默认情况下,required = true,即依赖bean必须存在,如果不存在,则会抛出异常。但是,通过将required属性设置为false,则依赖bean不存在也不会报错。
2. @Resource
@Resource是Java EE规范的一部分,但Spring同样支持该注解。
@Resource的bean的匹配规则
默认根据name进行注入,如果无法通过名称匹配到对应的 Bean 的话,会根据type进行匹配,找到与指定类型兼容的 Bean 并进行注入,如果都匹配不到则抛出异常。
使用 name 属性指定资源的名称
@Component public class MyClass { // 名为 "myBean1" 的 bean 将会被注入 @Resource(name = "myBean1") private MyBean myBean; }
使用默认名称匹配资源
@Component public class MyClass { // 名为“mybean”的bean将被注入 @Resource private MyBean myBean; }
根据type 属性来指定要注入的bean类型
public interface MyService { void fetchData(); } @Component public class MyServiceA implements MyService { public void fetchData() { System.out.println("from MyServiceA"); } } @Component public class MyServiceB implements MyService { public void fetchData() { System.out.println("from MyServiceB"); } } @Component public class DataProcessor { // 根据指定type注入myServiceA的bean @Resource(type = MyServiceA.class) private MyService myService; // 与上面效果相同注入myServiceA的bean @Resource private MyServiceA myServiceA; // 与上面效果相同注入myServiceA的bean @Resource private MyService myServiceA; // 与上面效果相同注入myServiceA的bean @Resource(name = "myServiceA") private MyService myService; // 注入bean失败,存在两个bean @Resource private MyService myService; }
@Resource不存在required属性
到此这篇关于Spring中@Autowired和@Resource注解的使用区别详解的文章就介绍到这了,更多相关@Autowired和@Resource注解区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!