文章目录
- 简介
- @Autowired注解
- 什么是@Autowired注解
- @Autowired注解的使用方式
- @Autowired注解的优势和不足
- @Qualifier
- 总结:
- @Resource注解
- 什么是@Resource注解
- @Resource注解的使用方式
- @Resource注解的优势和不足
- @Autowired vs @Resource
- @Autowired和@Resource的区别
- 为什么推荐使用@Resource
- 选择适合场景的注解
- 总结
简介
@Autowired和@Resource是Java Spring框架中用于依赖注入的注解。本文将介绍它们的定义、使用方式以及区别,帮助读者正确使用这两个注解。
@Autowired注解
什么是@Autowired注解
@Autowired是一个Spring特有的注解,用于自动装配Bean。它可以标记在字段、构造方法、Setter方法或者普通方法上,告诉Spring容器需要自动注入相关的依赖。
@Autowired注解的使用方式
使用@Autowired注解的方式有以下几种:
- 字段注入:
@Autowired
private UserService userService;
- 构造方法注入:
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
- Setter方法注入:
private UserService userService;
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
- 方法注入:
@Autowired
public void init(UserService userService) {
this.userService = userService;
}
@Autowired注解的优势和不足
优势:
- 自动生成Bean的实例,简化了代码的编写。
- 提高了代码的可读性和可维护性。
不足:
- 如果有多个符合条件的Bean存在,会产生歧义,需要进一步指定匹配规则。
@Qualifier
@Qualifier注解是Spring框架提供的用于解决依赖注入歧义性的注解。当存在多个符合条件的Bean时,可以结合@Autowired或@Resource注解使用@Qualifier注解来明确指定要注入的Bean的名称或限定符。
通过在@Autowired或@Resource注解上使用@Qualifier注解,可以指定要注入的特定Bean的名称或限定符。这样能够解决当有多个相同类型的Bean存在时,容器无法确定要注入哪个Bean的问题。
以下是使用@Qualifier注解的示例:
@Component
public class MyService {
@Autowired
@Qualifier("myBean")
private MyBean myBean;
// ...
}
在这个例子中,当有多个类型为MyBean的Bean存在时,通过@Qualifier(“myBean”)注解指定要注入名为"myBean"的Bean。
需要注意的是,@Qualifier注解的值对应于具体Bean的名称或限定符。如果没有定义Bean的名称或限定符,则可以使用默认的限定符,默认情况下与Bean的类名(首字母小写)相同。
总结:
@Qualifier注解是Spring框架提供的用于解决依赖注入歧义性的注解。通过结合@Autowired或@Resource注解使用@Qualifier注解,可以明确指定要注入的特定Bean的名称或限定符。这样能够解决当有多个相同类型的Bean存在时,容器无法确定要注入哪个Bean的问题。
@Resource注解
什么是@Resource注解
@Resource是Java标准的注解,也可以用于依赖注入。它可以标记在字段、构造方法、Setter方法或者普通方法上,告诉容器需要自动注入相关的依赖。
@Resource注解的使用方式
@Resource注解可以通过name属性指定要注入的Bean名称,如果没有指定name属性,则会根据字段名或方法名进行自动装配。
(先Name后type)
@Resource
private UserService userService;
@Resource注解的优势和不足
优势:
- 可以指定要注入的Bean名称,避免了歧义。
- 支持注入基本类型的值。
不足:
- 没有提供required属性,无法对注入结果进行非空验证。
@Autowired vs @Resource
@Autowired和@Resource的区别
- 来源:@Autowired是Spring特有的注解,而@Resource是Java标准的注解。
- 自动装配规则:@Autowired默认按类型进行自动装配,@Resource默认按名称进行自动装配。
- 使用范围:@Autowired可以用于构造方法、字段、Setter方法等,而@Resource只能用于字段和Setter方法。
- 注入机制:@Autowired不能注入基本类型的值,而@Resource可以。
为什么推荐使用@Resource
为什么更推荐使用 @Resource ?
Resource注解在字段上,这个注解是属于J2EE的,减少了与spring的耦合。
但是其实啊,这个问题,我觉得很多人可能对它的理解有误!
更推荐使用 @Resource ,我觉得不是因为@Resource注解性能更好之类的。
而是因为其可以指定是通过 name 还是 type 的注入方式,而@Autowired注解本身自己是不能实现这个效果的,要和@Qualifier一起用才可以!
选择适合场景的注解
- 如果只使用Spring框架,建议使用@Autowired注解。
- 如果需要保持代码的独立性,或者可能迁移到其他容器中,建议使用@Resource注解。
总结
@Autowired 根据类型type注入,
@Qualifier(“cusInfoService”)//一般作为@Autowired()的修饰用,
@Autowired @Qualifie(“userService”) 两个结合起来可以根据名字和类型注入
@Resource 默认根据名字name注入,其次按照类型搜索,也可以通过name和type属性进行选择性注入
一般@Autowired和@Qualifier一起用,@Resource单独用。
当然没有冲突的话@Autowired也可以单独用