• SpringBoot 自动配置原理


    1. SpringBoot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration

     2. @EnableAutoConfiguration的作用:

    •   利用AutoConfigurationImportSelector给容器中导入一些组件;
    •   可以参考selectimports()方法的内容;
    • List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);获取候选配置
      SpringFactoriesLoader.loadFactoryNames();
      扫描所有jar包类路径下 META-INF/spring.factories; 把扫描到的文件内容包装成properties对象;

      将类路径下 META-INF/spring.factories 里面配置的所有EnableAutoConfiguration的值加入到了容器中,如下:
      
      # Initializers
      org.springframework.context.ApplicationContextInitializer=
      org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,
      org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener
      
      # Application Listeners
      org.springframework.context.ApplicationListener=
      org.springframework.boot.autoconfigure.BackgroundPreinitializer
      
      # Auto Configuration Import Listeners
      org.springframework.boot.autoconfigure.AutoConfigurationImportListener=
      org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener
      
      # Auto Configuration Import Filters
      org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=
      org.springframework.boot.autoconfigure.condition.OnBeanCondition,
      org.springframework.boot.autoconfigure.condition.OnClassCondition,
      org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition
      
      # 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
      
      # Failure analyzers
      org.springframework.boot.diagnostics.FailureAnalyzer=
      org.springframework.boot.autoconfigure.diagnostics.analyzer.NoSuchBeanDefinitionFailureAnalyzer,
      org.springframework.boot.autoconfigure.flyway.FlywayMigrationScriptMissingFailureAnalyzer,
      org.springframework.boot.autoconfigure.jdbc.DataSourceBeanCreationFailureAnalyzer,
      org.springframework.boot.autoconfigure.jdbc.HikariDriverConfigurationFailureAnalyzer,
      org.springframework.boot.autoconfigure.session.NonUniqueSessionRepositoryFailureAnalyzer
      
      # Template availability providers
      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.servlet.JspTemplateAvailabilityProvider

      每一个 xxxAutoConfiguration类都是容器的一个组件,都是加入到容器中;用他们来做自动配置。

    3. 每一个自动配置类进行自动配置功能;

    4. 以HttpEncodingAutoConfiguration为例解释自动配置:

    @Configuration(proxyBeanMethods = false)  //标识这是一个配置类,可以给容器添加组件
    @EnableConfigurationProperties(HttpProperties.class)  //启动指定类的ConfigurationProperties功能;
    将配置文件中对应的值和HttpEncodingProperties绑定起来;并把HttpEncodingProperties加入到ioc容器中 @ConditionalOnWebApplication(type
    = ConditionalOnWebApplication.Type.SERVLET)  //Spring底层@Conditional注解,
    根据不同的条件,如果满足指定的条件,整个配置类里面的配置就会生效;这里是判断当前应用是否为web应用,如果是,则当前配置类生效
    @ConditionalOnClass(CharacterEncodingFilter.
    class)  //判断当前项目有没有这个类,
    CharacterEncodingFilter:SpringMVC中进行乱码解决的过滤器 @ConditionalOnProperty(prefix
    = "spring.http.encoding", value = "enabled", matchIfMissing = true)  //判断
    配置文件中是否存在某个配置 spring.http.encoding.enabled;如果不存在,判断也是成立的
    public class HttpEncodingAutoConfiguration { private final HttpProperties.Encoding properties;    //只有一个有参构造器,参数的值会默认从容器中拿 public HttpEncodingAutoConfiguration(HttpProperties properties) { this.properties = properties.getEncoding(); } @Bean  //给容器中添加一个组件,这个组件的某些值需要从properties中获取 @ConditionalOnMissingBean public CharacterEncodingFilter characterEncodingFilter() { CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter(); filter.setEncoding(this.properties.getCharset().name()); filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST)); filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE)); return filter; }
  • 相关阅读:
    缓存常见问题及解决方案
    项目中的代码都是如何分层的?
    函数式编程:从命令式重构到函数式
    优秀程序员绝不轻易告诉你的六大职场好习惯
    做前端程序员需要会什么,企业的招聘需求是如何?
    Docker常用指令
    【华为云技术分享】6行Python代码实现进度条效果(Progress、tqdm、alive-progress​​​​​​​和PySimpleGUI库)
    【华为云技术分享】华为IoT首席架构师王启军:全栈工程师“养成记”
    【华为云技术分享】【测试微课堂】缺陷处理流程和注意事项
    【华为云技术分享】【测试微课堂】测试金字塔和持续自动化测试
  • 原文地址:https://www.cnblogs.com/luo-jian/p/12889421.html
Copyright © 2020-2023  润新知