该表明利用在成员属性和setter方法上。默认情形下@Resource按照名称注入,如果没有显式声明名称则按照变量名称或者方法中对应的参数名称进行注入。
如果我们希望在目标Bean中表示多态我们可以这样写:
/ 多态的表示. @author felord.cn @since 9 :26 /@Componentpublic class ResourceTest { @Resource private ApplicationRunner applicationRunner; @Resource private ApplicationRunner runner; // ...}
Qualifier 约束拜会 Spring 表明 @Qualifier 详细解析

@Autowired常日适用于布局函数,成员变量以及方法上。它的机制是这样的:
这个表明我们是须要好好聊聊的,日常利用频率相称高。
3.1 标注在布局上通过在目标Bean的布局函数上标注就可以注入对应的Bean。
package cn.felord;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.ApplicationRunner;import org.springframework.stereotype.Component;/ @author felord.cn @since 9:26 /@Componentpublic class AutowiredTest { private final ApplicationRunner applicationRunner; @Autowired public AutowiredTest(ApplicationRunner applicationRunner) { this.applicationRunner = applicationRunner; }}
从Spring Framework 4.3开始,@Autowired如果目标Bean只定义一个布局函数,则不再须要在该布局函数上添加@Autowired表明。如果目标Bean有几个布局函数可用,并且没有主/默认布局函数,则必须至少有一个布局函数被@Autowired标记,以指示Spring IoC容器利用哪个布局函数。
3.2 标注在成员变量上和@Resource一样,@Autowired也可以标注到目标Bean的成员变量上。
/ @author felord.cn @since 9:26 /@Componentpublic class AutowiredTest { @Autowired private ApplicationRunner applicationRunner; // ...}
3.3 标注到方法上
一样平常setter方法上利用的比较多。而且一个 @Autowired 支持注入多个参数。
/ The type Autowired test. @author felord.cn @since 9 :26 /@Componentpublic class AutowiredTest { private ApplicationRunner applicationRunner; private EmployeeMapper employeeMapper; private DepartmentMapper departmentMapper; / Sets application runner. @param applicationRunner the application runner / @Autowired public void setApplicationRunner(ApplicationRunner applicationRunner) { this.applicationRunner = applicationRunner; } / 支持多参数 @param employeeMapper the employee mapper @param departmentMapper the department mapper / @Autowired public void prepare(EmployeeMapper employeeMapper, DepartmentMapper departmentMapper) { this.employeeMapper = employeeMapper; this.departmentMapper = departmentMapper; }}
你以为这就完了?下面这种办法估计大多数人并没有在意过。
/ The type Autowired test. @author felord.cn @since 9 :26 /@Componentpublic class AutowiredTest { // 注入 数组 @Autowired private MovieCatalog[] movieCatalogs; private Map<String, Movie> movies; private Set<CustomerPreferenceDao> customerPreferenceDaos; // 注入 set @Autowired public MovieRecommender(Set<CustomerPreferenceDao> customerPreferenceDaos) { this.customerPreferenceDaos = customerPreferenceDaos; } // 注入 map @Autowired public void setMovieCatalogs(Map<String, Movie> movies) { this.movies = movies; } // ...}
可以把Bean注入目标Bean的数组、凑集容器中去。默认情形下,当给定注入点没有匹配的候选Bean可用时,自动装置将失落败。至少应有一个匹配元素。
如果您希望元素按照特定顺序排序,则元素Bean可以实现org.springframework.core.Ordered接口或者对应表明@Order或标准@Priority。基于某些机制不建议利用表明办法来排序,否则无法达到预期期望,推举利用接口Ordered。
3.4 装置可选@Resource没有供应可选择装置的特性,一旦无法装置则会抛出非常;而@Autowired供应了required属性(默认值为true)以避免这种情形,设置@Autowired为false。
/ The type Autowired test. @author felord.cn @since 9 :26 /@Componentpublic class AutowiredTest { // 一旦找不到 movieFinder 不会非常 而初始化为 null @Autowired(required = false) private MovieFinder movieFinder; // ...}
这里也有骚操作,你可以忽略required属性。通过 Java 8的 java.util.Optional来表明候选Bean可选。
/ The type Autowired test. @author felord.cn @since 9 :26 /@Componentpublic class AutowiredTest {public class SimpleMovieLister { // 利用 Optional 表明候选Bean可选 @Autowired public void setMovieFinder(Optional<MovieFinder> movieFinder) { // ... }}
从Spring 5.0开始,您还可以利用@Nullable表明,这个表明可以你自己实现检测逻辑或者直策应用 JSR-305供应的javax.annotation.Nullable。
/ The type Autowired test. @author felord.cn @since 9 :26 /@Componentpublic class AutowiredTest {public class SimpleMovieLister { // 利用 @Nullable 表明表明候选Bean可选 @Autowired public void setMovieFinder(@Nullable MovieFinder movieFinder) { // ... }}
4. @Inject
从Spring 3.0开始,Spring供应对JSR-330标准表明(依赖注入)的支持。 你须要引入依赖:
<dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version></dependency>
然后你就可以利用干系的表明来进行依赖注入了,个中紧张表明为@javax.inject.Inject。大部分情形下该表明都可以代替@Autowired利用,但@Inject没有required属性,不过它也可以与java.util.Optional或利用@Nullable来达到同样的效果。
大部分情形下没有人喜好额外引入Jakarta EE依赖来利用一个已经拥有的功能,Spring堵去世了Jakarta EE依赖注入的生态。
5. 总结@Resource和@Autowired的优先级顺序不同(拜会上图),其余@Resource属于 Jakarta EE规范而@Autowired属于Spring范畴,@Resource无法利用在布局参数中,@Autowired支持required属性。从面向工具来说,@Resource更加适用于多态性的细粒度注入,而@Autowired更多专注于多态的单例注入。@Inject 则没必要过多谈论,只作为一个添头。好了本日就到这里,多多关注:码农小胖哥,更多干货知识分享。