Spring 框架中@Resource和@Autowired是用于实现依赖注入的两个重要注解,及@Primary注解
目录
一、主要区别和简单使用场景
1. @Resource
2. @Autowired
3. @Primary
二、项目工程简单实例
三种处理方案:
三、总结
四、拓展知识
一、主要区别和简单使用场景
1. @Resource
来源:JSR-250 规范(Java 标准注解),属于 Java EE的一部分。
依赖查找方式:默认按名称(name)查找 Bean,若找不到则按类型(type)匹配。
常用属性:
name:指定要注入的 Bean 名称。
type:指定要注入的 Bean 类型。
简单实例:
@Resource(name = "userService") // 按名称注入名为"userService"的Bean
private UserService userService;@Resource(type = UserRepository.class) // 按类型注入UserRepository类型的Bean
private UserRepository repository;
特点:
支持更细粒度的名称控制,适合明确指定依赖名称的场景。
若未指定name,则默认以字段名或方法名作为查找名称。
2. @Autowired
来源:Spring 框架自定义注解。
依赖查找方式:默认按类型(type)匹配,若存在多个同类型 Bean,则需结合@Qualifier指定名称。
常用搭配:
@Qualifier:指定具体的 Bean 名称。
required = false:允许依赖为null(默认为true)。
简单实例:
@Autowired
private UserService userService; // 按类型注入UserService的实现类@Autowired
@Qualifier("primaryUserService") // 存在多个UserService实现时,指定注入名为"primaryUserService"的Bean
private UserService userService;
特点:
更符合 Spring 的依赖注入理念(基于类型)。
支持构造函数、字段、Setter 方法等多种注入方式。
3. @Primary
作用:在存在多个相同类型的 Bean 时,指定首选的 Bean。
场景:当自动装配(如 @Autowired)遇到多个候选 Bean 时,Spring 会优先选择被 @Primary 标注的 Bean。
@Primary // 当存在多个EmpService类型的Bean时,优先使用此类
@Service // 将此类标记为Spring管理的Service Bean
public class EmpServiceA implements EmpService {// 实现接口方法@Overridepublic void doSomething() {System.out.println("使用EmpServiceA的实现");}
}
注意事项
唯一性:同一类型的 Bean 中只能有一个被 @Primary 标注,否则会导致冲突。
优先级:@Primary 的优先级高于 @Qualifier,但低于通过 @Qualifier 直接指定名称。
二、项目工程简单实例
service包下面的接口EmpService分别被EmpServiceA和EmpServiceB两个实现类实现,且使用@Service注解交给IOC容器管理,此时存在多个同类型的Bean。
此时编译器就会提示这个错误:Could not autowire. There is more than one bean of 'EmpService' type.也就是这个类型的bean超过了一个。
三种处理方案:
//方案一:使用JDK提供的Resource注解指定bean名称@Resource(name = "empServiceB")private EmpService empService;
//方案二:使用Autowired注解+@Qualifier注解指定bean名称@Qualifier("empServiceA")@Autowiredprivate EmpService empService;
//方案三: 当存在多个EmpService类型的Bean时,优先使用此类
@Primary
@Service
public class EmpServiceA implements EmpService {
}
三、总结
四、拓展知识
@Autowired(required = false) 和@Autowired(required = true)
基础作用
默认行为(required = true):
当容器中找不到匹配类型的 Bean 时,Spring 会抛出 NoSuchBeanDefinitionException,强制依赖必须存在,否则启动报错。
required = false 效果:
允许依赖 “可选”,若容器中无匹配 Bean,不会抛异常,而是将字段置为 null(普通类型)或空集合(集合类型,如 List/Set 等),让程序在缺少依赖时仍能启动。
示例:
@Autowired(required = false)
@Nullable
private EmpService empService;