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


版权声明:本文为qq_51702676原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。