Spring Boot 自动配置原理

本文详细解析了SpringBoot的自动化配置原理,介绍了如何通过条件化配置实现自动化配置,并提供了自动配置报告的开启方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

了解了Spring Boot的自动化配置原理(它也是Spring Boot的核心),以后想要什么功能,该如何配置,找到对应的自动配置类看看变知道如何使用了。

Spring Boot 引入的自动配置让我们从复杂而有容易出错的的jar和版本控制中解放出来,下面来看看Spring Boot 是如何实现自动配置的。

配置原理

在主应用程序代码中可以看到

124017_RIO1_3049601.png

进入@SpringBootApplication注解

124352_iNvj_3049601.png

进入@EnableAutoConfigration注解

124828_UfFr_3049601.png

进入EnableAutoConfigurationImportSelector,再进入父类AutoConfiguationImportSelector,查看selectImports方法

125008_KKFe_3049601.png

进入getCandidateConfigurations方法

	protected List<String> getCandidateConfigurations(AnnotationMetadata metadata,
			AnnotationAttributes attributes) {
		List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
				getSpringFactoriesLoaderFactoryClass(), 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;
	}

该方法会将自配配置相关类全部加在进来,这些类都在spring-boot-autoconfig-xxxx.jar中

{
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=org.springframework.boot.autoconfigure.condition.OnClassCondition
org.springframework.boot.diagnostics.FailureAnalyzer=org.springframework.boot.autoconfigure.diagnostics.analyzer.NoSuchBeanDefinitionFailureAnalyzer
org.springframework.boot.autoconfigure.jdbc.DataSourceBeanCreationFailureAnalyzer
org.springframework.boot.autoconfigure.jdbc.HikariDriverConfigurationFailureAnalyzer
org.springframework.boot.autoconfigure.AutoConfigurationImportListener=org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener
org.springframework.context.ApplicationContextInitializer=org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer
org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer
org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider=org.springframework.boot.autoconfigure.freemarker.FreeMarkerTemplateAvailabilityProvider
org.springframework.boot.autoconfigure.mustache.MustacheTemplateAvailabilityProvider
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAvailabilityProvider
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafTemplateAvailabilityProvider
org.springframework.boot.autoconfigure.web.JspTemplateAvailabilityProvider
org.springframework.context.ApplicationListener=org.springframework.boot.autoconfigure.BackgroundPreinitializer
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.CloudAutoConfiguration
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.CassandraRepositoriesAutoConfiguration
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration
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.jpa.JpaRepositoriesAutoConfiguration
org.springframework.boot.autoconfigure.data.ldap.LdapDataAutoConfiguration
org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration
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.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.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.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.flyway.FlywayAutoConfiguration
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration
org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration
org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration
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.mobile.DeviceResolverAutoConfiguration
org.springframework.boot.autoconfigure.mobile.DeviceDelegatingViewResolverAutoConfiguration
org.springframework.boot.autoconfigure.mobile.SitePreferenceAutoConfiguration
org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration
org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration
org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration
org.springframework.boot.autoconfigure.security.SecurityFilterAutoConfiguration
org.springframework.boot.autoconfigure.security.FallbackWebSecurityAutoConfiguration
org.springframework.boot.autoconfigure.security.oauth2.OAuth2AutoConfiguration
org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration
org.springframework.boot.autoconfigure.session.SessionAutoConfiguration
org.springframework.boot.autoconfigure.social.SocialWebAutoConfiguration
org.springframework.boot.autoconfigure.social.FacebookAutoConfiguration
org.springframework.boot.autoconfigure.social.LinkedInAutoConfiguration
org.springframework.boot.autoconfigure.social.TwitterAutoConfiguration
org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration
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.DispatcherServletAutoConfiguration
org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration
org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration
org.springframework.boot.autoconfigure.web.HttpEncodingAutoConfiguration
org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration
org.springframework.boot.autoconfigure.web.MultipartAutoConfiguration
org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration
org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration
org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration
org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration
org.springframework.boot.autoconfigure.websocket.WebSocketMessagingAutoConfiguration
org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration
}

是不是见到了很多有点熟悉的配置类了。。比如DataSourceAutoConfiguration,

131942_rrVE_3049601.png

@EnableConfigurationProperties注解是将DataSourceProperties属性类实例化加入容器

打开DataSourceProperties类,可以该配置类是读取配置文件中spring.datasource开头的相关属性,比如spring.datasource.name。

194928_6Z2g_3049601.png

在application.yml中输入spring.datasource可以看到如下的属性,都是该配置类(DataSourceProperties)中的属性

195208_UW5S_3049601.png

 

@ConditionOnClass和@ConditionOnBean 注解是Spring4.0开始引入的条件配置,而Spring Boot正是有了条件配置才能真正实现自动化配置,而且他们两个非常核心,比如要覆盖自动化配置,Spring Boot较常使用检查是否有已经注入的Bean的手段去忽略本身的自动化配置,从而使自定义的配置生效(Spring Boot 先加在自定义配置,再逐一进行自动配置,这样的顺序保证了自定义配置生效)

条件注解

列举一下自动配置的条件化配置注解:

@ConditionalOnBean                    配置了某个特定的Bean

@ConditionalOnMissingBean       没有配置某个特定的Bean

@ConditionalOnClass                   Classpath里有指定的类

@ConditionalOnMissingClass       Classpath里没有指定的类

@ConditionalOnExpression          给定的Spring Expression Language表达式计算结果为TRUE  

@ConditionalOnJava                    Java的版本匹配特定值或者一个范围

@ConditionalOnJndi                   参数中给定的JNDI位置必须存在一个,如果没有给参数,则要有JNDI                                                       InitialContext

@ConditionalOnProperty             指定的配置属性要有一个明确的值

@ConditionalOnResouce              Classpath里有指定的资源

@ConditionalOnWebApplication 这是一个Web应用程序

@ConditionalOnNotWebApplication    这不是一个Web应用程序

@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })

表示只有当类路劲中有DataSource.class 和 EmbeddedDatabaseType.class 该配置才会生效。

Spring Boot正是使用条件化配置,帮我们自动实现复杂的配置,让开发者专注于应用程序本身,为后面微架构奠定了坚实的基础。

 

@ComponentScan默认扫描目录为Spring Boot主应用程序的目录,所以建议大家在编写代码的时候,尽量都将目录放在主应用程序目录下,减少对@ComponentScan的配置。

120353_ASnU_3049601.png

这段代码即说明了默认是扫描的主应用程序目录

3.自动配置报告

    在application.yml或者application.properties中添加debug: true或者debug=true开启自动配置报告

============================
CONDITIONS EVALUATION REPORT
============================


//被Spring Boot识别成功,满足条件判断,最终加入容器中的自动配置类
Positive matches:
-----------------

   CodecsAutoConfiguration matched:
      - @ConditionalOnClass found required class 'org.springframework.http.codec.CodecConfigurer'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)

   CodecsAutoConfiguration.JacksonCodecConfiguration matched:
      - @ConditionalOnClass found required class 'com.fasterxml.jackson.databind.ObjectMapper'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)

//被Spring Boot识别成功,不满足条件判断,最终没能加入容器中的自动配置类
Negative matches:
-----------------

   ActiveMQAutoConfiguration:
      Did not match:
         - @ConditionalOnClass did not find required classes 'javax.jms.ConnectionFactory', 'org.apache.activemq.ActiveMQConnectionFactory' (OnClassCondition)

   AopAutoConfiguration:
      Did not match:
         - @ConditionalOnClass did not find required classes 'org.aspectj.lang.annotation.Aspect', 'org.aspectj.lang.reflect.Advice', 'org.aspectj.weaver.AnnotatedElement' (OnClassCondition)

以后要看该Spring Boot项目具有了那些功能,就可以查看该报告即可

注意发布到生产环境的时候把debug改为false或者去掉debug的配置

转载于:https://my.oschina.net/u/3049601/blog/1539226

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值