一、核心一句话总结
@Autowired:Spring 注解,默认按类型注入。
@Resource:Java 原生规范注解,默认按名称注入,名称找不到再按类型。
二、核心注入规则
1. @Autowired 规则:先按类型,再名称
默认优先级:类型匹配 > 变量名匹配
-
Spring 优先根据变量类型去容器中匹配 Bean
-
如果同类型有多个 Bean,出现冲突报错
NoUniqueBeanDefinitionException -
冲突后自动尝试用变量名匹配 BeanName 做兜底
缺点:多实现类场景极易冲突,需要手动加 @Qualifier / @Primary 解决。
2. @Resource 规则:先按名称,再类型
默认优先级:名称匹配 > 类型匹配
-
优先根据变量名去匹配 Bean 的名称
-
名称匹配不到时,再按类型注入
优势:多实现场景更稳定、不容易冲突;缺点是灵活性略低。
三、多实现类场景举例
假设接口 UserService 有两个实现类:UserServiceImpl1、UserServiceImpl2
1. @Autowired
java
@Autowired
private UserService userService;
按类型匹配出两个 Bean →直接报错:不唯一 Bean。
解决方式:必须手动指定唯一 Bean
-
@Qualifier("beanName")精确指定名称
java
@Autowired
@Qualifier("userServiceImpl1")
private UserService userService;
-
@Primary设置默认优先 Bean
java
@Primary
@Service
public class UserServiceImpl1 implements UserService {}
2. @Resource
java
@Resource
private UserService userServiceImpl1;
优先根据变量名userServiceImpl1 匹配 Bean 名称,自动精准注入,无冲突。
写在最后:跟豆包总结学习记录,下次面试应该可以说个一二了。