@SpringBootApplication注解的使用
一、前言
大部分的配置都可以用java类+注解来代替,而在springboot项目中见的最多的莫过于@springbootapplication注解了,它在每个springboot的启动类上都有标注。
这个注解对springboot的启动和自动配置到底有什么样的影响呢?本文将为各位大佬解析它的源码,揭开@springbootapplication注解神秘的面纱。
二、正文
对springboot工程的自动配置很感兴趣,于是学习其源码并整理了其中一些内容,如果有错误请大家指正~话不多说,直接上源码;
@springbootapplication注解的源码如下:
可以看到这是一个复合注解,一共包括7个不同的注解,下面对这7个不同的注解进行分析。
2.1 注解
2.1.1 注解1:@target({elementtype.type})
用来表示注解作用范围,type表示作用范围为类或接口。
2.1.2 注解2:@retention(retentionpolicy.runtime)
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注解的使用的资料请关注其它相关文章!