• SpringBoot-07-配置文件配置原理


    4.11 配置文件配置原理

    • springboot启动时,会自动配置spring-boot-autoconfigure-2.7.0.jar/META-NF/spring.factories核心文件中的xxxAutoConfiguration
    • Configuration:配置类,会被spring接管配置
    • spring.factories文件中自动配置类有上百项,如下:
    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.context.ConfigurationPropertiesAutoConfiguration
    org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration
    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.ElasticsearchDataAutoConfiguration
    org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration
    org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration
    org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRestClientAutoConfiguration
    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.Neo4jReactiveDataAutoConfiguration
    org.springframework.boot.autoconfigure.data.neo4j.Neo4jReactiveRepositoriesAutoConfiguration
    org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration
    org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration
    org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration
    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.ElasticsearchRestClientAutoConfiguration
    org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration
    org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration
    org.springframework.boot.autoconfigure.graphql.GraphQlAutoConfiguration
    org.springframework.boot.autoconfigure.graphql.data.GraphQlReactiveQueryByExampleAutoConfiguration
    org.springframework.boot.autoconfigure.graphql.data.GraphQlReactiveQuerydslAutoConfiguration
    org.springframework.boot.autoconfigure.graphql.data.GraphQlQueryByExampleAutoConfiguration
    org.springframework.boot.autoconfigure.graphql.data.GraphQlQuerydslAutoConfiguration
    org.springframework.boot.autoconfigure.graphql.reactive.GraphQlWebFluxAutoConfiguration
    org.springframework.boot.autoconfigure.graphql.rsocket.GraphQlRSocketAutoConfiguration
    org.springframework.boot.autoconfigure.graphql.rsocket.RSocketGraphQlClientAutoConfiguration
    org.springframework.boot.autoconfigure.graphql.security.GraphQlWebFluxSecurityAutoConfiguration
    org.springframework.boot.autoconfigure.graphql.security.GraphQlWebMvcSecurityAutoConfiguration
    org.springframework.boot.autoconfigure.graphql.servlet.GraphQlWebMvcAutoConfiguration
    org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration
    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.jersey.JerseyAutoConfiguration
    org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration
    org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration
    org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration
    org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration
    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.neo4j.Neo4jAutoConfiguration
    org.springframework.boot.autoconfigure.netty.NettyAutoConfiguration
    org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
    org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration
    org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration
    org.springframework.boot.autoconfigure.r2dbc.R2dbcTransactionManagerAutoConfiguration
    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.sql.init.SqlInitializationAutoConfiguration
    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.ReactiveMultipartAutoConfiguration
    org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration
    org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration
    org.springframework.boot.autoconfigure.web.reactive.WebSessionIdResolverAutoConfiguration
    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 这配置文件中能配置的内容,都存在一个固有的规律xxxAutoConfiguration:自动配置类自动装配了默认属性—默认值xxxProperties,而xxxProperties又和配置文件绑定,我们就可以使用自定义的配置了!

    • 所以我们可以在配置文件输入需要配置的属性,点开这个属性对应的xxxProperties属性类,里面的实例变量就是我们可以配置的内容。

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

    • 每一个自动配置类可以进行自动配置功能;:

    • 我们以HttpEncodingAutoConfiguration(Http编码自动配置)为例解释自动配置原理;

    package org.springframework.boot.autoconfigure.web.servlet;
    
    import org.springframework.boot.autoconfigure.AutoConfiguration;
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
    import org.springframework.boot.autoconfigure.web.ServerProperties;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.boot.web.server.WebServerFactoryCustomizer;
    import org.springframework.boot.web.servlet.filter.OrderedCharacterEncodingFilter;
    import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
    import org.springframework.boot.web.servlet.server.Encoding;
    import org.springframework.context.annotation.Bean;
    import org.springframework.core.Ordered;
    import org.springframework.web.filter.CharacterEncodingFilter;
    
    /**
     * {@link EnableAutoConfiguration Auto-configuration} for configuring the encoding to use
     * in web applications.
     *
     * @author Stephane Nicoll
     * @author Brian Clozel
     * @since 2.0.0
     */
    @AutoConfiguration
    /*表示这是一个自动配置类,跟在springmvc编写的配置文件一样,也可以给容器中添加组件
    启动指定类的ConfigurationProperties功能:
    进入这个HttpProperties查看,将配置文件中对应的值和ServerProperties绑定起来;
    并把ServerProperties加入到ioc容器中
    */
    @EnableConfigurationProperties(ServerProperties.class)
    
    //Spring底层@Conditional注解
    //根据不同的条件判断,如果满足指定的条件,整个配置类里面的配置就会生效:
    //这里的意思就是判断当前应用是否是web应用,如果是,当前配置类生效
    @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
    
    //判断当前项目有没有这个类CharacterEncodingFilter;SpringMVC中进行乱码解决的过滤器:
    @ConditionalOnClass(CharacterEncodingFilter.class)
    
    //判断配置文件中是否存在某个配置:spring.http.encoding.enabled;
    //如果不存在,判断也是成立的
    //即使我们配置文件中不配置spring.http.encoding.enabled=true,也是默认生效的;
    @ConditionalOnProperty(prefix = "server.servlet.encoding", value = "enabled", matchIfMissing = true)
    public class HttpEncodingAutoConfiguration {
       //已经和SpringBoot的配置文件映射了
       private final Encoding properties;
       //只有一个有参构造器的情况下,参数的值就会从容器中拿
       public HttpEncodingAutoConfiguration(ServerProperties properties) {
          this.properties = properties.getServlet().getEncoding();
       }
       //给容器中添加一个组件,这个组件的某些值需要从properties中获取
       @Bean
       @ConditionalOnMissingBean//判断容器没有这个组件?
       public CharacterEncodingFilter characterEncodingFilter() {
          CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
          filter.setEncoding(this.properties.getCharset().name());
          filter.setForceRequestEncoding(this.properties.shouldForce(Encoding.Type.REQUEST));
          filter.setForceResponseEncoding(this.properties.shouldForce(Encoding.Type.RESPONSE));
          return filter;
       }
    
       @Bean
       public LocaleCharsetMappingsCustomizer localeCharsetMappingsCustomizer() {
          return new LocaleCharsetMappingsCustomizer(this.properties);
       }
    
       static class LocaleCharsetMappingsCustomizer
             implements WebServerFactoryCustomizer, Ordered {
    
          private final Encoding properties;
    
          LocaleCharsetMappingsCustomizer(Encoding properties) {
             this.properties = properties;
          }
    
          @Override
          public void customize(ConfigurableServletWebServerFactory factory) {
             if (this.properties.getMapping() != null) {
                factory.setLocaleCharsetMappings(this.properties.getMapping());
             }
          }
    
          @Override
          public int getOrder() {
             return 0;
          }
    
       }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 一句话总结:根据当前不同的条件判断,决定这个配置类是否生效!

    • 一但这个配置类生效;这个配置类就会给容器中添加各种组件;这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的;

    • 所有在配置文件中能配置的属性都是在XxxProperties类中封装着;配置文件能配置什么就可以参照某个功能对应的这个属性类

    • 这就是自动装配的原理!

      • 精髓:
      • 1)、SpringBoot启动会加载大量的自动配置类
      • 2)、我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中;
      • 3)、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了)
      • 4)、给容器中自动配置类添加组件的时候,会从xxxproperties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可;
      • xxxAutoConfigurartion:自动配置类;给容器中添加组件
      • xxxxProperties:封装配置文件中相关属性;

    下一篇:SpringBoot-08-@Conditional注解使用说明

  • 相关阅读:
    明解STM32—GPIO应用设计篇之IO外部中断EXTI原理及使用方法
    gitblit git pycharm 新建版本库及push备忘
    Docker最常用的镜像命令和容器命令
    Livox SLAM(带LIO+闭环检测优化)
    《python》paramiko+paramiko实现远程通过ssh通道连接数据库
    【python基础】复杂数据类型-字典(遍历)
    React报错之Invalid hook call
    基于AI的pdf转word方法
    [UE笔记]客户端服务器时间同步
    2021年50道Java线程面试题
  • 原文地址:https://blog.csdn.net/weixin_42045639/article/details/126370365