目录
**本文基于
spring-boot-2.2.6.RELEASE
版本的源码进行说明,不同版本的源码可能会有一些区别。**
一. @SpringBootApplication
1. @EnableAutoConfiguration
要清楚SpringBoot自动配置原理,就要明白
@SpringBootApplication
注解的组成,此注解主要是这三个注解组成:
@SpringBootConfiguration
,
@EnableAutoConfiguration
,
@ComponentScan
。
下面是源码:
@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan(
excludeFilters ={@Filter(
type =FilterType.CUSTOM,
classes ={TypeExcludeFilter.class}),@Filter(
type =FilterType.CUSTOM,
classes ={AutoConfigurationExcludeFilter.class})})public@interfaceSpringBootApplication{
@SpringBootConfiguration
与
@ComponentScan
这两个注解已经是老生常谈了,在下图中已经标注,不做太多解释了😁。
关键就看今天这个需要剖析的主角查看源码
@EnableAutoConfiguration
:
@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@AutoConfigurationPackage@Import({AutoConfigurationImportSelector.class})public@interfaceEnableAutoConfiguration{StringENABLED_OVERRIDE_PROPERTY="spring.boot.enableautoconfiguration";Class<?>[]exclude()default{};String[]excludeName()default{};}
这里又出现两个很重要的注解下面我们逐个介绍一下
@AutoConfigurationPackage
,
@Import
。
@Import
的作用就是给容器导入一个组件,这个组件可以是一个类,会在项目启动的时候执行内部的方法,这里导入的是
AutoConfigurationImportSelector
这个类。
2.@AutoConfigurationPackage
我们先看自动配置包注解
@AutoConfigurationPackage
源码:
@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@Import({AutoConfigurationPackages.Registrar.class})public@interfaceAutoConfigurationPackage{}
这里的
@Import
导入了
AutoConfigurationPackages.Registrar.class
这个组件,进去看源码:
staticclassRegistrarimplementsImportBeanDefinitionRegistrar,DeterminableImports{Registrar(){}publicvoidregisterBeanDefinitions(AnnotationMetadata metadata,BeanDefinitionRegistry registry){AutoConfigurationPackages.register(registry,(newPackageImport(metadata)).getPackageName());}publicSet<Object>determineImports(AnnotationMetadata metadata){returnCollections.singleton(newPackageImport(metadata));}}
这段代码的作用是将自动配置的包注册到Bean定义的注册表中。
主要看
registerBeanDefinitions
这个方法的作用:
AnnotationMetadata metadata
: 包含了注解元数据的对象,有关正在扫描的类的注解信息。BeanDefinitionRegistry registry
: 负责保存和管理应用程序中所有的Bean定义。AutoConfigurationPackages.register(registry, (new PackageImport(metadata)).getPackageName())
: 这是方法的具体实现。它调用了AutoConfigurationPackages
的register
方法,并将注册表和包名作为参数传递给该方法。
简单来说就是通过
Registrar
给容器中导入一系列的组件,并将指定包下的所有组件注册到Spring容器中。
我们可以通过断点来验证此结论:将上面的代码打上断点查看元注解信息就是你的SpringBoot启动类。
计算出第二个参数值会返回包名,SpringBoot会根据你的包名加载所有扫描出来的组件信息。
二. 初始加载自动配置类
上面还导入了
AutoConfigurationImportSelector.class
这个组件,点击源码追踪到
selectImports
这个方法:
/**
* 根据指定的注解元数据,选择要导入的组件。
* @param annotationMetadata 注解元数据,包含有关正在扫描的类的注解信息
* @return 要导入的组件类名数组
*/publicString[]selectImports(AnnotationMetadata annotationMetadata){// 如果当前组件不是启用状态,则返回一个空数组if(!this.isEnabled(annotationMetadata)){returnNO_IMPORTS;}else{// 从类加载器中加载自动配置元数据AutoConfigurationMetadata autoConfigurationMetadata =AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);// 获取与指定注解元数据相匹配的自动配置条目AutoConfigurationEntry autoConfigurationEntry =this.getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);// 将自动配置条目中的配置类名转换成字符串数组并返回returnStringUtils.toStringArray(autoConfigurationEntry.getConfigurations());}}
这段代码的核心在于
getAutoConfigurationEntry
这个方法,目的就是给容器中批量导入一些组件。
getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);
深入此方法的源码:
```java
/**
* 获取自动配置条目,决定哪些配置类将被导入到Spring容器中进行自动配置。
*
* @param autoConfigurationMetadata 自动配置的元数据,用于获取配置类信息。
* @param annotationMetadata 注解元数据,用于获取注解信息。
* @return AutoConfigurationEntry对象,包含需要导入的配置类和排除的配置类信息。
*/protectedAutoConfigurationEntrygetAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata,AnnotationMetadata annotationMetadata){if(!this.isEnabled(annotationMetadata)){// 如果未启用自动配置,则返回一个空的AutoConfigurationEntry对象returnEMPTY_ENTRY;}else{// ①获取注解元数据中的属性信息AnnotationAttributes attributes =this.getAttributes(annotationMetadata);// 获取候选的配置类列表List<String> configurations =this.getCandidateConfigurations(annotationMetadata, attributes);// 去除重复的配置类
configurations =this.removeDuplicates(configurations);// 获取需要排除的配置类集合Set<String> exclusions =this.getExclusions(annotationMetadata, attributes);// 检查是否有配置类被排除this.checkExcludedClasses(configurations, exclusions);// 从候选的配置类中移除被排除的配置类
configurations.removeAll(exclusions);// 根据自动配置元数据对候选的配置类进行过滤
configurations =this.filter(configurations, autoConfigurationMetadata);// 触发自动配置导入事件this.fireAutoConfigurationImportEvents(configurations, exclusions);// 返回包含需要导入的配置类和排除的配置类信息的AutoConfigurationEntry对象returnnewAutoConfigurationEntry(configurations, exclusions);}}
这段代码的核心在于
getCandidateConfigurations
这个方法,目的是将所有需要自动配置的类导入到Sping容器中,将此方法进行断点追踪:
可以发现有
124
个配置被导入了,注意每个版本导入的配置不一样,注意区分,那么这些配置是从哪里来的呢?我们继续追踪
getCandidateConfigurations
的源码:
```java
/**
* 获取候选的自动配置类列表。
*
* @param metadata 注解元数据,用于获取注解信息。
* @param attributes 注解属性,用于获取属性信息。
* @return 候选的自动配置类列表,从META-INF/spring.factories中加载配置。
* @throws IllegalArgumentException 如果没有在META-INF/spring.factories中找到自动配置类,抛出该异常。
*/protectedList<String>getCandidateConfigurations(AnnotationMetadata metadata,AnnotationAttributes attributes){// 通过SpringFactoriesLoader从META-INF/spring.factories加载所有自动配置类的全限定类名List<String> configurations =SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(),this.getBeanClassLoader());// 检查是否成功加载了自动配置类Assert.notEmpty(configurations,"No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");// 返回候选的自动配置类列表return configurations;}
这段代码用于获取候选的自动配置类列表,它通过SpringFactoriesLoader从
META-INF/spring.factories
文件中加载所有自动配置类的全限定类名。
META-INF/spring.factories
是Spring Boot用于定义自动配置的配置文件,其中指定了各种自动配置类和相关配置信息。,这个文件的位置是在每个JAR包下,并不是每个包都会有,最核心的是下图中自动配置包:
上面的
124
个候选配置类全部都在此文件中:
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudServiceConnectorsAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\
org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveRestClientAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\
org.springframework.boot.autoconfigure.elasticsearch.jest.JestAutoConfiguration,\
org.springframework.boot.autoconfigure.elasticsearch.rest.RestClientAutoConfiguration,\
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\
org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\
org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\
org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\
org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\
org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\
org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration,\
org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration,\
org.springframework.boot.autoconfigure.influx.InfluxDbAutoConfiguration,\
org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\
org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\
org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\
org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\
org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration,\
org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\
org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,\
org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,\
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration,\
org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration,\
org.springframework.boot.autoconfigure.rsocket.RSocketMessagingAutoConfiguration,\
org.springframework.boot.autoconfigure.rsocket.RSocketRequesterAutoConfiguration,\
org.springframework.boot.autoconfigure.rsocket.RSocketServerAutoConfiguration,\
org.springframework.boot.autoconfigure.rsocket.RSocketStrategiesAutoConfiguration,\
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration,\
org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration,\
org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration,\
org.springframework.boot.autoconfigure.security.rsocket.RSocketSecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyAutoConfiguration,\
org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\
org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.client.reactive.ReactiveOAuth2ClientAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.resource.reactive.ReactiveOAuth2ResourceServerAutoConfiguration,\
org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\
org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration,\
org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration,\
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\
org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,\
org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration,\
org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration,\
org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration
三. 按需开启自动配置
上面所有候选的自动配置中,并不是所有配置都会全部开启,SpringBoot会按需去开启自动配置。
SpringBoot将所有这些自动配置都会归结到
xxxxAutoConfiguration.java
中,比如关于AOP的自动配置类
AopAutoConfiguration.java
,那么SpringBoot是如何进行按需去开启自动配置的呢?
主要看这几个条件注解:
@ConditionalOnClass
: 当指定的类位于类路径上时,才会应用配置。可以用来根据类的存在与否来决定是否开启自动配置。@ConditionalOnBean
: 当指定的Bean已经存在于Spring容器中时,才会应用配置。可以用来依赖其他Bean的存在与否来决定是否开启自动配置。@ConditionalOnMissingBean
: 当指定的Bean不存在于Spring容器中时,才会应用配置。可以用来检查某个Bean是否缺失,从而决定是否开启自动配置。@ConditionalOnProperty
: 当指定的配置属性满足条件时,才会应用配置。可以根据配置文件中的属性值来决定是否开启自动配置。
下面就用
BatchAutoConfiguration.java
来详细说明一下按需自动配置的过程的。先看
BatchAutoConfiguration.java
自动批处理配置的源码:
@Configuration(
proxyBeanMethods =false)@ConditionalOnClass({JobLauncher.class,DataSource.class})@AutoConfigureAfter({HibernateJpaAutoConfiguration.class})@ConditionalOnBean({JobLauncher.class})@EnableConfigurationProperties({BatchProperties.class})@Import({BatchConfigurerConfiguration.class})publicclassBatchAutoConfiguration{
下面来具体分析这段代码:
@Configuration(proxyBeanMethods =false)
默认情况下,
proxyBeanMethods
为
true
,表示Spring会使用CGLIB代理来保证@Bean方法的调用,设置为false时,将禁用CGLIB代理,以用于增强性能。
@ConditionalOnClass({JobLauncher.class,DataSource.class})
当类路径下同时存在
JobLauncher
和
DataSource
类时,才会启用该自动配置类。说明,当应用程序中同时使用了批处理(Batch)功能和数据源(数据库)时,这个自动配置类才会生效。
@AutoConfigureAfter({HibernateJpaAutoConfiguration.class})
在
HibernateJpaAutoConfiguration.java
完成配置之后,批处理自动配置类将会生效。
@ConditionalOnBean({JobLauncher.class})
当Spring容器中存在
JobLauncher
这个Bean时,才会启用该自动配置类。
@EnableConfigurationProperties({BatchProperties.class})
表示启用
BatchProperties
类的配置属性支持。用于配置批处理相关的属性值。
@Import({BatchConfigurerConfiguration.class})
导入
BatchConfigurerConfiguration
配置类,进一步完成批处理的自动配置。
总结一下,只有全部满足以下全部条件,批处理这个类才会生效:
- 类路径中存在
JobLauncher
和DataSource
类。 - 应用程序已经定义了
JobLauncher
这个Bean。 - 在
HibernateJpaAutoConfiguration
加载配置完成之后,自动配置类才会生效。 - 启用了
BatchProperties
类的配置属性支持。 - 可能会导入
BatchConfigurerConfiguration
配置类,用于进一步完成批处理的自动配置。
当上面的类校验完成之后,就会依次去执行内部含有
@Bean
定义的一些组件,导入Spring容器中,这里只分析一种方法,其他方法的分析方式是一样的。
/**
* 创建并配置一个JobLauncherCommandLineRunner Bean,用于在应用程序启动时执行批处理作业。
* 当满足以下条件时,该Bean会被创建:
* 1. Spring容器中不存在JobLauncherCommandLineRunner Bean(@ConditionalOnMissingBean注解)。
* 2. 配置属性中指定了"spring.batch.job.enabled"属性,并且值为"true"(@ConditionalOnProperty注解)。
* 3. BatchProperties类中的配置属性"spring.batch.job.names"(作业名称列表)有值(非空字符串)时,会将该值设置到JobLauncherCommandLineRunner中。
* 4. 如果"spring.batch.job.enabled"属性没有配置或没有指定值,将默认为"true"(matchIfMissing = true)。
*
* @param jobLauncher 用于启动批处理作业的JobLauncher Bean。
* @param jobExplorer 用于探查已经运行过的作业的JobExplorer Bean。
* @param jobRepository 用于管理作业实例的JobRepository Bean。
* @param properties 用于配置批处理的BatchProperties对象。
* @return 创建的JobLauncherCommandLineRunner Bean。
*/@Bean@ConditionalOnMissingBean@ConditionalOnProperty(
prefix ="spring.batch.job",
name ={"enabled"},
havingValue ="true",
matchIfMissing =true)publicJobLauncherCommandLineRunnerjobLauncherCommandLineRunner(JobLauncher jobLauncher,JobExplorer jobExplorer,JobRepository jobRepository,BatchProperties properties){JobLauncherCommandLineRunner runner =newJobLauncherCommandLineRunner(jobLauncher, jobExplorer, jobRepository);String jobNames = properties.getJob().getNames();if(StringUtils.hasText(jobNames)){
runner.setJobNames(jobNames);}return runner;}
当满足以下条件时,该Bean会被创建:
- Spring容器中不存在
JobLauncherCommandLineRunner
这个Bean(@ConditionalOnMissingBean
注解)。 - 配置属性中指定了
spring.batch.job.enabled
属性,并且值为true
(@ConditionalOnProperty
注解)。 BatchProperties
类中的配置属性spring.batch.job.names
(作业名称列表)有值(非空字符串)时,会将该值设置到JobLauncherCommandLineRunner
中。- 如果
spring.batch.job.enabled
属性没有配置或没有指定值,将默认为true
(matchIfMissing = true
)。
到这里,SpringBoot的自动配置原理基本上就结束了,下面就总结一下:
- SpringBoot会从
META-INF/spring.factories
文件中自动加载xxxxAutoConfiguration
的所有配置类 - 每个配置类会按照特定的条件进行校验来进行按需加载,同时会默认绑定获取
properties
文件中的值 - 生效的配置类会在容器中配置很多的组件
- 当然这些组件我们可以自己进行配置(通过Java类或者配置文件中配置)
版权归原作者 爪哇斗罗 所有, 如有侵权,请联系我们删除。