前言
🍊作者简介: 不肯过江东丶,一个来自二线城市的程序员,致力于用“猥琐”办法解决繁琐问题,让复杂的问题变得通俗易懂。
🍊支持作者: 点赞👍、关注💖、留言💌~
在 Java 开发中,我们经常会遇到需要依赖注入的情况。依赖注入是一种设计模式,它可以帮助我们管理对象之间的依赖关系,提高代码的可维护性和可测试性。而在 Spring 框架中,有两个常用的注解 @Autowired 和 @Resource,它们都可以用来实现依赖注入。但是可能有些小伙伴对二者并不是很了解,或者说是不清楚二者之间的区别,那么今天大聪明就跟各位小伙伴深入浅出的聊一聊 @Autowired 和 @Resource 的区别。
@Autowired 注解和 @Resource 注解
@Autowired 和 @Resource 都是 Java 中用于依赖注入的注解,它们能够帮助开发者实现对类成员、方法和构造函数等的自动装配。然而,它们在使用方式、适用范围以及功能上存在一些差异。
@Autowired
@Autowired 是 Spring 框架自带的注解,用于实现自动装配。它通过类型匹配的方式,在容器中查找匹配的Bean,并将其注入到目标对象中。@Autowired 可以用在构造方法、字段、Setter方法和普通方法上。当被注解的元素被调用时,Spring 会自动查找并注入匹配的 Bean。如果有多个匹配的 Bean存在,可以通过 @Qualifier 注解指定具体的Bean名称。示例代码如下👇
@Autowired
private UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
我们在上面提到一句话:“可以通过 @Qualifier 注解来指定具体的Bean名称”,我们再来一起看看 @Qualifier 注解如何使用。@Qualifier 注解是 Spring 框架提供的用于限定符的注解,它可以与 @Autowired 一起使用。通过在 @Autowired 注解上添加 @Qualifier 注解,并指定具体的 Bean 名称作为参数,可以告诉 Spring 容器要注入哪个具体的 Bean。例如👇
@Autowired
@Qualifier("userService")
private UserService userService;
在上述示例中,我们使用@Autowired注解注入了一个 UserService 类型的 Bean,并通过 @Qualifier 注解指定了具体的 Bean 名称为 “userService”。这样,Spring 容器会根据指定的名称找到对应的 Bean,并将其注入到 userService 属性中。需要注意的是,@Qualifier 注解的参数值必须与目标 Bean 的名称一致,否则会抛出 NoSuchBeanDefinitionException 异常(表示在容器中找不到对应的Bean定义)。
@Resource
@Resource 是 JavaEE 标准的注解,也可用于实现依赖注入。它通过名称匹配的方式,在容器中查找匹配的Bean,并将其注入到目标对象中。@Resource 可以用在字段、Setter 方法和普通方法上。它可以通过 name 属性指定要注入的 Bean 名称,也可以通过 type 属性指定要注入的 Bean 类型。如果没有指定 name 或 type 属性,则默认按照名称匹配查找。示例代码如下👇
@Resource
private UserService userService;
@Resource(name = "userService")
public void setUserService(UserService userService) {
this.userService = userService;
}
@Resource(name="userName", type=String.class)
private String userName;
@Autowired 和 @Resource 的异同
🌲 相同点 🌲
- 作用相同: 两者都用于实现依赖注入,可以自动装配一个bean到需要它的地方。
- 实现依赖注入: 均可以在类的字段、Setter方法或构造函数上使用,用于告诉容器注入特定的依赖。
🌴 不同点 🌴
1、来源和适用范围:
- @Autowired 是 Spring Framework的一部分,广泛用于 Spring 应用中,可以用在字段、构造函数以及Setter方法上。
- @Resource 是 Java EE 规范的一部分,更通用,可以用在字段和Setter方法上,但不支持构造函数注入。
2、装配方式:
- @Autowired根据类型进行装配,容器会根据类型自动在上下文中查找匹配的bean进行注入。
- @Resource根据名称进行装配,默认按照变量名匹配,也可以通过name属性指定名称进行注入。
3、限制:
- @Autowired默认情况下要求依赖是必须存在的(除非使用@Autowired(required = false)设置为非必须)。
- @Resource默认按名称匹配,必须存在与指定名称相匹配的bean。
4、兼容性:
- @Autowired 是Spring 特有的注解,因此在 Spring 应用中使用广泛。
- @Resource 是 Java EE 标准的一部分,因此具有更广泛的兼容性,可以在不同的 Java EE 容器中使用。
5、用法差异:
- @Autowired 可以与 @Qualifier 联合使用,解决多个相同类型的 bean 自动装配问题。
- @Resource 不支持构造函数注入,并且不能与 @Qualifier 一同使用。
小结
本人经验有限,有些地方可能讲的没有特别到位,如果您在阅读的时候想到了什么问题,欢迎在评论区留言,我们后续再一一探讨🙇
希望各位小伙伴动动自己可爱的小手,来一波点赞+关注 (✿◡‿◡) 让更多小伙伴看到这篇文章~ 蟹蟹呦(●’◡’●)
如果文章中有错误,欢迎大家留言指正;若您有更好、更独到的理解,欢迎您在留言区留下您的宝贵想法。
你在被打击时,记起你的珍贵,抵抗恶意;
你在迷茫时,坚信你的珍贵,抛开蜚语;
爱你所爱 行你所行 听从你心 无问东西