欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

@SpringBootApplication注解的使用

程序员文章站 2022-05-14 15:01:54
一、前言大部分的配置都可以用java类+注解来代替,而在springboot项目中见的最多的莫过于@springbootapplication注解了,它在每个springboot的启动类上都有标注。这...

一、前言

大部分的配置都可以用java类+注解来代替,而在springboot项目中见的最多的莫过于@springbootapplication注解了,它在每个springboot的启动类上都有标注。

这个注解对springboot的启动和自动配置到底有什么样的影响呢?本文将为各位大佬解析它的源码,揭开@springbootapplication注解神秘的面纱。

二、正文

对springboot工程的自动配置很感兴趣,于是学习其源码并整理了其中一些内容,如果有错误请大家指正~话不多说,直接上源码;

@springbootapplication注解的源码如下:

可以看到这是一个复合注解,一共包括7个不同的注解,下面对这7个不同的注解进行分析。

2.1 注解

2.1.1 注解1:@target({elementtype.type})

用来表示注解作用范围,type表示作用范围为类或接口。

@SpringBootApplication注解的使用

2.1.2 注解2:@retention(retentionpolicy.runtime)

@SpringBootApplication注解的使用

2.1.3 注解3:@documented

表明这个注释是由 javadoc记录的。

2.1.4 注解4:@inherited

放在注解上,当父类加了@springbootapplication注解时,子类也会继承这个注解(对接口的实现类无效)。

2.1.5 注解5:@springbootconfiguration

底层仍是@configuration注解, 源码如下:

2.1.6 注解6:@componetscan

@componentscan这个注解在spring中很重要,它对应xml配置中的元素@componentscan的功能其实就是自动扫描并加载符合条件的组件(比如@component和@repository等)或者bean定义,最终将这些bean定义加载到ioc容器中。

可以通过basepackages等属性来细粒度的定制@componentscan自动扫描的范围,如果不指定,则默认spring框架实现会从声明@componentscan所在类的package进行扫描。所以springboot的启动类最好是放在root package下,因为默认不指定basepackages。

2.2 注解:@enableautoconfiguration

个人感觉@enableautoconfiguration这个annotation最为重要它的作用可以概括为:借助@import的帮助,将所有符合自动配置条件的bean定义加载到ioc容器。

其源码如下:

这里需要关注@autoconfigurationpackage和@import(autoconfigurationimportselector.class)两个注解。

2.2.1 注释:@autoconfigurationpackage

源码如下:

可以发现这个注解的核心其实也是import注解,表示对于标注该注解的类的包,应当使用autoconfigurationpackages注册。接着看registrar这个类:

这个类中的核心方法是register方法:

register方法的逻辑非常清晰:如果这个bean已经被注册,就获取它的构造函数参数值,并将包名添加进去;否则就创建一个新的bean定义并进行注册。通过@autoconfigurationpackage这个注解,可以将注解所在包下所有的组件进行注册。

2.2.2 注解:@import(autoconfigurationimportselector.class)

这个注解导入了autoconfigurationimportselector这个类这个类的核心方法是selectimports方法,实现importselector接口。方法基于我们在pom.xml文件中配置的jar包和组件进行导入。所以方法返回的是一个class全路径的string数组,返回的class会被spring容器管理。方法源码如下:

这个方法的结构也很清晰,首先通过isenabled方法判断是否需要进行导入,如果需要导入的话,通过loadmetadata方法获取配置信息,并通过getautoconfigurationentry进行自动装配。isenabled方法源码如下:

这个方法通过enableautoconfiguration.enabled_override_property这个配置项进行判断是否需要自动配置,默认为true。loadmetadata方法源码如下:

可以看到这个方法会加载meta-inf/spring-autoconfigure-metadata.properties下的所有配置信息并包装成autoconfigurationmetadata对象返回。

注:spring-autoconfigure-metadata.properties文件在spring-boot-autoconfigure-2.1.9.release.jar/meta-inf下。

getautoconfigurationentry方法源码如下:

这个方法是autoconfiguration的主流程方法,可以将这个方法的每一行看做一个步骤,那么处理步骤如下:

1. 加载配置了@enableautoconfiguration注解的属性值getattribute方法:

2.得到meta-inf/spring.factories文件中以@enableautoconfiguration完全限定类名做key的value,getcandidateconfigurations方法:

其中,springfactoriesloader.loadfactorynames()这个方法的作用是使用给定的类加载器从meta-inf/spring.factories加载给定类型的工厂实现的完全限定类名;

3.去重;

4.得到需要排除的类的类名,这些类可以在@enableautoconfiguration注解中配置;

5.检查这两个集合;

6.把需要排除的类移除;

7.根据onbeancondition、onclasscondition等条件进行过滤(有兴趣可以深入了解);

8.广播事件,得到autoconfigurationimportlistener所有实现类,然后生成事件进行广播;

9.把需要装配和排除的类完全限定名封装成了autoconfigurationentry对象返回。

因此,@enableautoconfiguration可以简单总结为:从classpath中搜寻所有的meta-inf/spring.factories配置文件,并将其中enableautoconfiguration对应的配置项通过反射实例化为对应的标注了@configuration的ioc容器配置类,并加载到ioc容器。

三、小结

通过以上分析可知@springbootapplication注解的运作是通过@springapplicationconfiguration声明被标注类为配置类,从而被annotationconfigapplicationcontext扫描并初始化spring容器。

通过@enableautoconfiguration来扫描,过滤并加载所需要的组件;通过@componentscan扫描并注册所有标注了@component及其子注解的类;这些注解的共同运作实现了springboot工程强大的自动配置能力。

以上就是@springbootapplication注解的使用的详细内容,更多关于@springbootapplication注解的使用的资料请关注其它相关文章!