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