行业知识
@Autowired与@Resource注解介绍
2026-11-10 20:46:26
来源:互联网转载
1. 配置依赖注入方法
1.1 前提
参与���动装配的组件(需要装配、被装配)全部都必须在IoC容器中。
()注意:不区分IoC的方式!XML和注解都可以!
1.2 @Autowired注解
在成员变量上直接标记@Autowired注解即可,不需要提供setXxx()方法。
()2.@Autowired注解介绍
2.1 标记位置
2.1.1 成员变量
这是最主要的使用方式。与xml进行bean ref引用不同,他不需要有set方法。
@Servicepublic class EmpService { @Autowired private EmpDao empDao; public void getMessage() { empDao.getMessage(); }} 2.1.2 构造器
@Controllerpublic class EmpController { private EmpService empService; @Autowired public EmpController(EmpService empService) { this.empService = empService; }} 2.1.3 setXxx()方法
@Controllerpublic class EmpController { private EmpService empService; @Autowiredpublic void setEmpService(EmpService empService) {this.empService = empService;}} 2.2 工作流程
- 首先根据所需要的组件类型到 IOC 容器中查找
- 能够找到唯一的 bean:直接执行装配
- 如果完全找不到匹配这个类型的 bean:装配失败
- 和所需类型匹配的 bean 不止一个
- 没有 @Qualifier 注解:根据 @Autowired 标记位置成员变量的变量名作为 bean 的 id 进行匹配
- 能够找到:执行装配
- 找不到:装配失败
- 使用 @Qualifier 注解:根据 @Qualifier 注解中指定的名称作为 bean 的id进行匹配
- 能够找到:执行装配
- 找不到:装配失败
例如:
@Controllerpublic class EmpController { @Autowired @Qualifier(value = "emp") // 根据面向接口编程思想,使用接口类型引入Service组件 private EmpService empService;- IOC容器会首先查找EmpService 的组件
- 如果能够找到唯一的 bean:直接执行装配
- 如果完全找不到匹配这个类型的 bean:装配失败
- 如果这个类型的bean组件有多个,那就根据寻找id为emp的组件
- 如果找到,执行装配
- 找不到,装配失败
3. @Resource注解介绍
3.1 @Resource与@Autowired的区别
- @Resource注解是JDK扩展包中的,也就是说属于JDK的一部分。所以该注解是标准注解,更加具有通用性。(JSR-250标准中制定的注解类型。JSR是Java规范提案。)
- @Autowired注解是Spring框架自己的。
- @Resource注解默认根据Bean名称装配,未指定name时,使用属性名作为name。通过name找不到的话会自动启动通过类型装配。
- @Autowired注解默认根据类型装配,如果想根据名称装配,需要配合@Qualifier注解一起用。
- @Resource注解用在属性上、setter方法上。
- @Autowired注解用在属性上、setter方法上、构造方法上、构造方法参数上。
3.2 引入依赖
@Resource注解属于JDK扩展包,所以不在JDK当中,需要额外引入以下依赖:【高于JDK11或低于JDK8需要引入以下依赖】
jakarta.annotation jakarta.annotation-api 2.1.1
3.3 @Resource使用
@Controller public class XxxController { /** * 1. 如果没有指定name,先根据属性名查找IoC中组件xxxService * 2. 如果没有指定name,并且属性名没有对应的组件,会根据属性类型查找 * 3. 可以指定name名称查找! @Resource(name='test') == @Autowired + @Qualifier(value='test') */ @Resource private XxxService xxxService; //@Resource(name = "指定beanName") //private XxxService xxxService; public void show(){ xxxService.show(); } }
- IOC容器会首先查找EmpService 的组件
- 没有 @Qualifier 注解:根据 @Autowired 标记位置成员变量的变量名作为 bean 的 id 进行匹配