Autowired 与 Resource 注解的区别
省流
- @Autowired 默认 by type,也可以搭配 @Qualifier 来指定 by name;
- @Resource 默认 by name,找不到则 by type,他也可以显式指定 name 或 type。
# 1. Autowired 注解
@Autowired 为 Spring 提供的注解,采取的策略为按照类型注入:
public class UserService {
@Autowired
private UserDao userDao;
}
1
2
3
4
2
3
4
如上代码所示,这样装配回去 Spring 容器中找到类型为 UserDao
的类,然后将其注入进来。
但这样会产生一个问题:当一个类型有多个 bean 的时候,会造成无法选择具体注入哪一个 bean,这时我们就需要配合着 @Qualifier 使用。
@Qualifier 搭配 name 来告诉 Spring 具体去装配哪个 bean:
public class UserService {
@Autowired
@Qualifier(name="userDao1")
private UserDao userDao;
}
1
2
3
4
5
2
3
4
5
# 2. Resource 注解
@Resource 注解由 JavaEE 提供,它默认按照 name 自动注入:
public class UserService {
@Resource
private UserDao userDao;
}
1
2
3
4
2
3
4
如上的代码会注入一个 name 为 userDao 的 bean,如果匹配不到的话就回退为一个按照 type 来匹配,再匹配不到就抛出异常。
另外,@Resource 可以显式指定 type 或 name,即 @Resource(name = "userDao")
或 @Resource(type = "TeacherDao")
,当然也可以同时指定 type 和 name 来组合使用。当显式指定但又匹配不到时,会抛出异常。
# Summary
Spring 属于第三方的,JavaEE 是 Java 自己的东西,使用 @Resource 可以减少代码和 Spring 之间的耦合。
两者都可以写在 field 和 setter method 上,如果写在 field 上就不需要再写 setter 了。
无法唯一匹配时会抛出异常。
编辑 (opens new window)
上次更新: 2022/12/28, 16:48:24