0


深度剖析SpringBoot自动配置原理,为什么SpringBoot能为我们做那么多东西

目录

**本文基于

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

这个方法的作用:

  1. AnnotationMetadata metadata: 包含了注解元数据的对象,有关正在扫描的类的注解信息。
  2. BeanDefinitionRegistry registry: 负责保存和管理应用程序中所有的Bean定义。
  3. AutoConfigurationPackages.register(registry, (new PackageImport(metadata)).getPackageName()): 这是方法的具体实现。它调用了AutoConfigurationPackagesregister方法,并将注册表和包名作为参数传递给该方法。

简单来说就是通过

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是如何进行按需去开启自动配置的呢?

主要看这几个条件注解:

  1. @ConditionalOnClass: 当指定的类位于类路径上时,才会应用配置。可以用来根据类的存在与否来决定是否开启自动配置。
  2. @ConditionalOnBean: 当指定的Bean已经存在于Spring容器中时,才会应用配置。可以用来依赖其他Bean的存在与否来决定是否开启自动配置。
  3. @ConditionalOnMissingBean: 当指定的Bean不存在于Spring容器中时,才会应用配置。可以用来检查某个Bean是否缺失,从而决定是否开启自动配置。
  4. @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

配置类,进一步完成批处理的自动配置。

总结一下,只有全部满足以下全部条件,批处理这个类才会生效:

  • 类路径中存在JobLauncherDataSource类。
  • 应用程序已经定义了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属性没有配置或没有指定值,将默认为truematchIfMissing = true)。

到这里,SpringBoot的自动配置原理基本上就结束了,下面就总结一下:

  1. SpringBoot会从META-INF/spring.factories文件中自动加载xxxxAutoConfiguration的所有配置类
  2. 每个配置类会按照特定的条件进行校验来进行按需加载,同时会默认绑定获取properties文件中的值
  3. 生效的配置类会在容器中配置很多的组件
  4. 当然这些组件我们可以自己进行配置(通过Java类或者配置文件中配置)
标签: spring boot java 后端

本文转载自: https://blog.csdn.net/qq_41857955/article/details/131776499
版权归原作者 爪哇斗罗 所有, 如有侵权,请联系我们删除。

“深度剖析SpringBoot自动配置原理,为什么SpringBoot能为我们做那么多东西”的评论:

还没有评论