我们知道,在建立Spring Boot项目之后,即使不执行任何配置,它也可以顺利运行,这必须归因于Spring Boot的自动化配置。
Spring Boot使用application.properties或application.yml作为其全局配置文件默认情况下。我们可以在此配置文件中配置各种自动配置属性。
Spring Boot官方文档:列出并说明公共应用程序属性中的所有配置属性。我们可以根据官方文档配置弹簧启动,但是弹簧启动中的配置属性数量很大。曲折。只有当我们了解Spring Boot的自动配置的原理时,我们可以更轻松,熟练地配置Spirng启动。本节揭示了Springboot自动配置的神秘面纱。
Spring Boot的自动配置基于春季工厂机制。弹簧工厂机制是Spring Boot中的服务发现机制,它与Java SPI机制非常相似。SpringBoot将自动扫描Meta-Inf/Spring.factories文件。所有JAR软件包路径并将其内容读取到实例化。该机制也是弹簧靴启动器的基础。
spring.tractories文件基本类似于属性文件,该文件包含一组或更多组键值(key = vlaue)。在有限的名称中,一个接口可以设置多个实现类。不同的实现类使用“”,例如:
Spring-Core软件包定义了SpringFactoriesLoader类。此类将扫描所有JAR软件包路径下的meta -Inf/spring.factories文件,并获得指定接口的配置。两个外部方法在SpringFactoriesLoader类中定义,如下所示。
列表loadFactories(类FactoryType,@nullable ClassLoader classLoader)静态方法;根据接口获得其真实类的实例;此方法返回实现对象列表。listLoadFactoryNames(类> FactoryType,@nullable ClassLoader classLoader)公共静态方法;根据接口L获得其当前类的真实类的关键;实现类实现类名称的上述两种方法的关键是从指定的classloaderfiles获得弹簧,并且对类列表的分析,特定代码如下。loadFactories()方法()方法可以获取实现指定接口的对象。特定代码如下。
LoadFactoryNames()方法可以根据接口获得类别名称的集合,并且特定代码如下。
LoadSpringFactories()方法可以读取项目中所有JAR软件包路径下的Meta-Inf/spring.fectories文件的配置内容,并以MAP集合的形式返回。特定代码如下。
春季启动自动配置也是根据春季工厂机制实现的。Spring-boot-autoconfigure-xxx.jar在元I-Inf/spring.Spring Boot的元素中设置。
在上面的配置中,值的值由多个xxxautoconfigution组成。每个XXXAUTOCONFICUTION都是一个自动配置类。春季启动开始时,弹簧因素机制将用于立即实例化这些XXXAUTOCONFIGUTION,并将其作为组件添加到容器中以实现Spring Boot的自动配置。
所有春季启动项目都在主启动程序上使用@SpringBootApplication注释。该注释是Spring Boot中最重要的注释之一,也是Spring Boot实现自动配置的关键。@SpringBootApplication是组件的组合。它主要包含两个注释:@springbootConfiguration和@enableautoconfiguration。其中,@enableAutoconFiguration注释是Springboot自动化配置的核心。
@EnableAutoconFiguration注释用于打开Spring Boot的自动配置功能。它使用弹簧框架提供的@Import注释将自动配置组件通过AutoConfigurationImportSelector类(Selector)导入到容器中。
图2:@enableautoconfiguration
AutoConfigurationImportSelector包含3种方法,如下表所示
班级 extends Group>该集合中的配置类是各种方法中的各种方法中的AutoConfigurationGroup AutoConfigurationImportSelector。
在下面,我们将介绍以上三种方法及其呼叫过程。
1. getimportGroup()方法autoconfigurationImportSelector类getimportGroup()方法主要用于获得deferredimportselector.group的类。代码如下。
2. Process()方法静态内部类自动配置组的核心方法是过程()。此方法通过调用getAutoconFigurationEntry()方法来调用spring.factories文件的内容来读取自动配置类的内容。代码如下。
通过调用getCandIdateConfigurations()方法,通过调用自动配置类的完整限制名称,然后被排除并过滤后,它将其缓存到成员变量,如下所示。
在getCandidateConical()方法中,基于弹簧工厂机制的SpringFactoriesLoader的springFactoryLoader的LoadFactoryNames()方法,并获得类名称的实现类(自动配置接口)的收集,作为genableAutoconFiguration.classss class.classss。
图3:getCandidateConfiguration方法
3.执行所有上述方法后,AutoConfigurationImportSelector.autoconfigurationGroup#selectimports()将在处理和排除后处理Process()方法,最后将所有自动配置类添加到容器中。
弹簧中的所有自动配置类(fictries file(xxxautoconfiguration)必须在某些条件下作为组件添加到容器中,并且配置的内容将生效。这些限制以@conditional的形式反映在Spring Boot中的@conditional注释。, 如下所示。
@conditionalonwebapplication当前应用程序是Web应用程序@conditionalonnotwebapplication。当前的应用程序不是Web应用程序的有效性。下面,我们使用Spring Boot自动配置的服务。
ServletWebServerFactoryAutoconfiguration代码如下。
该课程使用以下注释:
除@configuration和@BEAN注释外,此类还使用5 @conditional衍生注释:
ServletWebserFactoryAutoconFiguration类还使用@enableconfigurationProperties注释。它通过此注释介绍了ServerProperties类,并且某些源代码如下。
我们可以看到,ServiceWebSerFactoryAutoconFiguration使用@enableconfigurationProperties注释,而ServerProperties类则使用@configurationProperties注释。这实际上是在弹簧启动自动配置机制中的常见用法。配置文件中的相关配置,以获取或修改配置。但是,否则将不使用该功能。XXXProperties类的配置函数。自动配置类XXXAUTOCONFIGURATION负责使用XXXProperties中的属性进行自动配置,而XXXProperties负责将自动配置属性与配置文件的相关配置绑定,该属性可以通过用户进行修改。默认的自动配置通过配置文件。换句话说,我们可以在配置文件中配置的哪些属性的真实“限制”是这些xxxxxproperties类,这是在配置文件文件中定义的前缀关键字开始时唯一的属性集。
注意:xxxautoconfigution和xxxproperties不对应于一个。在大多数情况下,还有更多的关系,也就是说,xxxautoconfigution可以同时使用多个xxxproperties中的属性。XXXProperties类也可以由多个XXXAUTONFONFONFONFONFONFONFONFONFONFONFONFONFONFONFONFONFONFIS类使用。