@AutoWired VS @Resource VS @Inject
# @AutoWired VS @Resource VS @Inject
本文只比较 Field Injection 和 Setter Injection 的方式,暂未比较构造函数注入的方式
Autowired | @Resource | @Inject | |
---|---|---|---|
来源 | Spring | JSR-250 (opens new window) | JSR-330 (opens new window) |
作用范围 | Field Injection Setter Injection | Field Injection Setter Injection | Field Injection Setter Injection |
注入规则 优先级由高到低 | By Bean Type By Qualifier By Bean Name | By Bean Name By Bean Type by Qualifier | By Bean Type By Qualifier By Bean Name |
注意事项 | 需要额外引入javax.inject 依赖 |
# 示例
# @Resource
# 字段注入
// case1. Inject by Bean Name
// 上下文中必须有名为 `authService` 的 Bean, 否则将抛出 NoSuceBeanDefinitionException
@Resource(name="authService")
private AuthService authService;
// case2. Inject by Bean Type
@Resource
private AuthService authService;
// case3. Inject by Qualifier
// 适用于同一种类型的 Bean 有多个实例时,需要在 `Qualifier` 中指定 Bean Name
@Resource
@Qualifier("authService1")
private AuthService authService1;
@Resource
@Qualifier("authService2")
private AuthService authService2;
# Setter 注入
使用方法与 Field Injection 基本相同,唯一区别是注解加在 set 方法上,如:
@Resource(name="authService")
protected void setAuthService(AuthService authService) {
this.authService = authService;
}
@Resource
@Qualifier("authService1")
public void setAuthService1(AuthService authService) {
this.authService1 = authService1;
}
# @Inject
# 字段注入
与 Resource 的 Field Injection基本相同,区别在于 By Bean Name 注入时的需要另一个注解 Named
,如:
@Inject
@Named("authService")
private AuthService authService;
# Setter 注入
与 Resource 的 Setter Injection相同
# AutoWired
# 字段注入
与 Resource 的 Field Injection基本相同,区别在于 By Bean Name 注入时变量名必须与 Bean Name 相同,如:
// AutoWired 先根据类型注入,当同一个类型有多个实例时,再根据 name 注入,此时变量名必须与Bean Name相同才能注入成功。
// 个人认为,此时用 `Qualifier` 更加直观,不易出错
@AutoWired
private AuthService authService;
# Setter 注入
上次更新: 2023/12/08, 06:34:37