本文基于
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 @interface SpringBootApplication {
@SpringBootConfiguration
与@ComponentScan
这两个注解已经是老生常谈了,在下图中已经标注,不做太多解释了😁。
关键就看今天这个需要剖析的主角查看源码@EnableAutoConfiguration
:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_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 @interface AutoConfigurationPackage {
}
这里的@Import
导入了AutoConfigurationPackages.Registrar.class
这个组件,进去看源码:
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
Registrar() {
}
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
AutoConfigurationPackages.register(registry, (new PackageImport(metadata)).getPackageName());
}
public Set<Object> determineImports(AnnotationMetadata metadata) {
return Collections.singleton(new PackageImport(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 要导入的组件类名数组
*/
public String[] selectImports(AnnotationMetadata annotationMetadata) {
// 如果当前组件不是启用状态,则返回一个空数组
if (!this.isEnabled(annotationMetadata)) {
return NO_IMPORTS;
} else {
// 从类加载器中加载自动配置元数据
AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
// 获取与指定注解元数据相匹配的自动配置条目
AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);
// 将自动配置条目中的配置类名转换成字符串数组并返回
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
}
这段代码的核心在于getAutoConfigurationEntry
这个方法,目的就是给容器中批量导入一些组件。
getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);
深入此方法的源码:
```java
/**
* 获取自动配置条目,决定哪些配置类将被导入到Spring容器中进行自动配置。
*
* @param autoConfigurationMetadata 自动配置的元数据,用于获取配置类信息。
* @param annotationMetadata 注解元数据,用于获取注解信息。
* @return AutoConfigurationEntry对象,包含需要导入的配置类和排除的配置类信息。
*/
protected AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata, AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
// 如果未启用自动配置,则返回一个空的AutoConfigurationEntry对象
return EMPTY_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对象
return new AutoConfigurationEntry(configurations, exclusions);
}
}
这段代码的核心在于getCandidateConfigurations
这个方法,目的是将所有需要自动配置的类导入到Sping容器中,将此方法进行断点追踪:
可以发现有124
个配置被导入了,注意每个版本导入的配置不一样,注意区分,那么这些配置是从哪里来的呢?我们继续追踪getCandidateConfigurations
的源码:
```java
/**
* 获取候选的自动配置类列表。
*
* @param metadata 注解元数据,用于获取注解信息。
* @param attributes 注解属性,用于获取属性信息。
* @return 候选的自动配置类列表,从META-INF/spring.factories中加载配置。
* @throws IllegalArgumentException 如果没有在META-INF/spring.factories中找到自动配置类,抛出该异常。
*/
protected List<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})
public class BatchAutoConfiguration {
下面来具体分析这段代码:
@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
)
public JobLauncherCommandLineRunner jobLauncherCommandLineRunner(JobLauncher jobLauncher, JobExplorer jobExplorer, JobRepository jobRepository, BatchProperties properties) {
JobLauncherCommandLineRunner runner = new JobLauncherCommandLineRunner(jobLauncher, jobExplorer, jobRepository);
String jobNames = properties.getJob().getNames();
if (StringUtils.hasText(jobNames)) {
runner.setJobNames(jobNames);
}
return runner;
}
当满足以下条件时,该Bean会被创建:文章来源:https://www.toymoban.com/news/detail-644370.html
- Spring容器中不存在
JobLauncherCommandLineRunner
这个Bean(@ConditionalOnMissingBean
注解)。 - 配置属性中指定了
spring.batch.job.enabled
属性,并且值为true
(@ConditionalOnProperty
注解)。 -
BatchProperties
类中的配置属性spring.batch.job.names
(作业名称列表)有值(非空字符串)时,会将该值设置到JobLauncherCommandLineRunner
中。 - 如果
spring.batch.job.enabled
属性没有配置或没有指定值,将默认为true
(matchIfMissing = true
)。
到这里,SpringBoot的自动配置原理基本上就结束了,下面就总结一下:文章来源地址https://www.toymoban.com/news/detail-644370.html
- SpringBoot会从
META-INF/spring.factories
文件中自动加载xxxxAutoConfiguration
的所有配置类 - 每个配置类会按照特定的条件进行校验来进行按需加载,同时会默认绑定获取
properties
文件中的值 - 生效的配置类会在容器中配置很多的组件
- 当然这些组件我们可以自己进行配置(通过Java类或者配置文件中配置)
到了这里,关于深度剖析SpringBoot自动配置原理,为什么SpringBoot能为我们做那么多东西的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!