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

@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获得授权,非商业转载请注明出处。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

NoLongerConfused

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

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

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

打赏作者

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

抵扣说明:

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

余额充值