原来@Autowired和@Resource 在项目中是...

@Autowired是Spring框架中的一个重要注解,用于自动装配bean。它支持构造器、setter方法、具有任意名称和多个参数的方法以及字段的注解,确保依赖的注入。推荐使用构造器注入以避免循环依赖问题,保持bean的不可变性和初始化状态。@Resource注解则是基于ByName的,源自JSR-250,可避免某些循环依赖。理解这两个注解的使用有助于优化Spring应用的依赖管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@Autowired 注解的作用到底是什么?
首先,我们从所属范围来看,事实上这个注解是属于 Spring 的容器配置的一个注解,与它同属容器配置的注解还有:@Required,@Primary, @Qualifier 等等。因此 @Autowired 注解是一个用于容器 (container) 配置的注解。
其次,我们可以直接从字面意思来看,@Autowired 注解来源于英文单词 autowire,这个单词的意思是自动装配的意思。自动装配又是什么意思?这个词语本来的意思是指的一些工业上的用机器代替人口,自动将一些需要完成的组装任务,或者别的一些任务完成。而在 Spring 的世界当中,自动装配指的就是使用将 Spring 容器中的 bean 自动的和我们需要这个 bean 的类组装在一起。

@Autowired 注解用法
在分析这个注解的实现原理之前,我们不妨先来回顾一下 @Autowired 注解的用法。

将 @Autowired 注解应用于构造函数,如以下示例所示
推荐

public class AutoTest {
 
    private final AutoDao autoDao ;
 
    @Autowired
    public AutoTest(AutoDao autoDao ) {
        this.autoDao = autoDao ;
    }
 
    // ...
}

将 @Autowired 注解应用于 setter 方法

public class AutoSet {
 
    private Autoxx autoxx ;
 
    @Autowired
    public void setautoxx (Autoxx autoxx ) {
        this.autoxx = autoxx ;
    }
 
    // ...
}

将 @Autowired 注解应用于具有任意名称和多个参数的方法

public class AutoDemo{
 
    private AutoDemo1 autoDemo1 ;
 
    private AutoDemo2 autoDemo2 ;
 
    @Autowired
    public void auto(AutoDemo1 autoDemo1 ,
            AutoDemo2 autoDemo2 ) {
        this.autoDemo1 = autoDemo1 ;
        this.autoDemo2 = autoDemo2 ;
    }
 
    // ...
}

您也可以将 @Autowired 注解应用于字段,或者将其与构造函数混合,如以下示例所示

public class AutoMM{
 
    private final AutoDao autoDao ;
 
    @Autowired
    private AutoFF autoFF ;
 
    @Autowired
    public AutoMM(AutoDao autoDao ) {
        this.autoDao = autoDao ;
    }
 
    // ...
}

推荐构造器注入,(可以避免循环依赖的问题,循环依赖的时候会报错,BeanCurrentlyInCreationException:Requested bean is currently in creation: Is there an unresolvable circular reference,其实配合@Qualifier 可以避免但是下面有更好的🙂)
引用Spring文档原文
The Spring team generally advocates constructor injection as it enables one to implement application components as immutable objects and to ensure that required dependencies are not null. Furthermore constructor-injected components are always returned to client (calling) code in a fully initialized state.

Spring团队通常提倡构造函数注入,因为它允许将应用程序组件实现为不可变对象,并确保所需的依赖项不为空。此外,构造函数注入的组件总是以完全初始化的状态返回给客户端(调用)代码。

下面来简单的解释一下:

依赖不可变:final关键字
依赖不为空:当要实例化Controller的时候,由于自己实现了有参数的构造函数,所以不会调用默认构造函数,那么就需要Spring容器传入所需要的参数,所以就两种情况:1、有该类型的参数->传入,OK 。2:无该类型的参数->报错。所以保证不会为空。
完全初始化的状态:这个可以跟上面的依赖不为空结合起来,向构造器传参之前,要确保注入的内容不为空,那么肯定要调用依赖组件的构造方法完成实例化。而在Java类加载实例化的过程中,构造方法是最后一步(之前如果有父类先初始化父类,然后自己的成员变量,最后才是构造方法)。所以返回来的都是初始化之后的状态。

如果觉得构造器代码编写不美观,团队允许的话可以使用Lombok插件提供的@RequiredArgsConstructor注解自动帮忙实现只需要在controller上添加该注解即可,不过一般我习惯
@RequiredArgsConstructor(onConstructor = @__(@Autowired))意思就是在构造器上自动添加@Autowired注解,其实现在版本的Spring已经不需要这么做了。

@Resource注解
Spring 中基于JSR-250 的注释,是基于ByName的,相对于单独的@Autowired,某种程度可以避免循环依赖,最重要的是基于JSR-250(Java注解规范,定义了一系列基于Java EE和Java SE通用注解。它避免了不同框架或组件间重复(或冗余)的注解)。

著作权归NoLongerConfused所有。商业转载请联系NoLongerConfused获得授权,非商业转载请注明出处。

### Spring 中 `@Autowired` 与 `@Resource` 的区别及其使用场景 #### 主要区别 1. **来源不同** - `@Autowired` 是由 Spring 提供的注解,主要用于 Spring 容器中的依赖注入[^1]。 - `@Resource` 则是由 JDK 提供的标准注解,遵循 JSR-250 规范,适用于任何支持该规范的 Java 容器[^4]。 2. **默认注入方式** - `@Autowired` 默认按照类型 (`ByType`) 进行匹配并完成 Bean 的注入。如果存在多个相同类型的 Bean,则会抛出异常。 - `@Resource` 默认按照名称 (`ByName`) 进行匹配。如果没有找到对应的名称,则退而求其次按类型进行匹配。 3. **解决多实现类的情况** - 当一个接口有多个实现类时: - 对于 `@Autowired`,可以配合 `@Qualifier` 明确指定需要注入的具体 Bean 名称。 - 而对于 `@Resource`,可以直接通过其属性 `name` 来显式指定目标 Bean 的名称。 4. **灵活性与控制力** - 在 Spring 应用开发中,推荐优先使用 `@Autowired`,因为它更加贴合 Spring 的设计理念,并提供诸如懒加载(`lazy-init=true`)以及更精细的错误处理机制等功能[^2]。 #### 使用场景分析 - 如果项目完全基于 Spring 或者主要采用 Spring 技术栈构建,则应首选 `@Autowired` 实现依赖注入操作。 - 若处于混合技术环境或者希望保持代码独立性(不绑定特定框架),那么可以选择更为通用的 `@Resource` 注解。 ```java // 示例:使用 @Autowired 配合 @Qualifier 处理多实现情况 @Component public class ExampleService { @Autowired @Qualifier("specificImplementation") private MyInterface myInstance; } // 示例:使用 @Resource 指定具体 bean name @Component public class AnotherExampleService { @Resource(name="anotherSpecificImplementation") private MyInterface anotherMyInstance; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NoLongerConfused

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值