请看下面几个问题
@Autowired
注解?@Resource
代替 @Autowired
注解?@Autowired
?@Autowired, @Qualifier, @Resource,
三者有何区别?下面, 我们带着以上问题去梳理和学习, 体会知识之间的关联性
@Autowired
注解上添加了警告
警告内容是: Field injection is not recommended
, 译为: 不推荐使用属性注入
原因详情描述: Inspection info: Spring Team recommends: "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies".
译为: Spring 团队建议: 始终在您的 bean 中使用基于构造函数的依赖注入。始终对强制依赖项使用断言
为什么 Spring 建议我们在Bean中使用构造注入呢? 想要回答这个问题, 我们需要了解 Spring的依赖注入(DI)方式 Spring常用的注入方式有: 简单类型注入, 集合类型注入, 域属性自动注入, 自动注入的类别, 空值注入, 构造注入 可以简化为: 属性注入, 构造方法注入, set 方法注入
下面, 来用代码展示下三种方式注入
@Autowired
注解在Bean 注入的时候是基于ByType
, 因此会由于注入两个相同类型的Bean导致装配失败
@Resource
的作用相当于@Autowired
,只不过@Autowired
按照byType
自动注入。
如果我们想使用按照名称byName
来装配,可以结合@Qualifier
注解一起使用。
@Resource
装配顺序:
①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
③如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
④如果既没有指定name,又没有指定type,则自动按照byName
方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
因此, 如果一定要使用属性注入, 可以使用 @Resource 代替 @Autowired 注解
@Autowired
: 通过byType
方式进行装配, 找不到或是找到多个,都会抛出异常。@Qualifier
: 如果想让@Autowired
注入的Bean进行 byName
装配, 可以使用 @Qualifier
进行指定@Resource
:作用相当于@Autowired
,只不过 @Resource
默认按照byName
方式装配, 如果没有匹配, 则退回到 byType
方式进行装配