Spring 支持使用@Autowired, @Resource, @Inject 三个注解进行依赖注入,下面来介绍一下这三个注解有什么区别。
@Autowired
-
@Autowired是Spring 框架提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired。
-
可以标注的位置:构造器、方法、方法参数、变量域和注解上面
-
在Spring容器解析@Autowired注解时,使用的后置处理器为AutowiredAnnotationBeanPostProcessor
-
@Autowired注解有一个required属性,当指定required属性为false时,意味着在容器中找相应类型的bean,如果找不到则忽略,而不报错(这一条是两个注解所没有的功能)。
-
支持@Primary注解,让Spring进行自动装配的时候,默认使用首选的bean。
-
装配顺序
- 默认优先按照类型去容器中找对应的组件,找到就赋值
- 如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找
- 如果组件id对象的bean不存在,而且required属性为true,就报错。
@Inject
-
SR330规范提供的注解(javax.inject.Inject),主要导入javax.inject包才能使用
-
可以标注的位置:方法、构造器和变量域中
-
在Spring容器解析@Inject注解时,使用的后置处理器和@Autowired是一样的,都是AutowiredAnnotationBeanPostProcessor
-
由于@Inject注解没有属性,在加载所需bean失败时,会报错
@Resource
-
@Resource是JSR250规范提供的注解(javax.annotation.Resource),不需要导入格外的包,这个注解在JDK的rt.jar包中
-
可以标注的位置:TYPE(表示可以标注在接口、类、枚举),FIELD(变量域)和METHOD(方法)上面。
-
在Spring容器解析@Resource注解时,使用的后置处理器为CommonAnnotationBeanPostProcessor
-
@Resource有两个重要的属性:name和type,
而Spring 将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。 -
@Resource默认是按照组件名称进行装配的
-
装配顺序
- 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
- 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
- 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
- 如果既没有指定name,又没有指定type,则默认按照byName方式进行装配;如果没有匹配,按照byTypeh进行装配。