springboot 配置文件以及自动配置

版权声明:本文为博主原创文章,欢迎转载,但请注明作者及文章出处,博文有什么不正之处欢迎指正。 https://blog.csdn.net/try_try_try/article/details/80500211

1.springboot 默认配置文件

        SpringBoot使用默认的全局的配置文件,application.properties / application.yml,配置文件名固定。

2.为什么需要配置文件

        我们知道SpringBoot在底层给我们自动做了一些配置,所以springboot项目不编写配置文件也可以正常运行,但是根据我们的具体开发我们需要修改SpringBoot自动配置的默认值

3.读取application.yml配置文件

  • Person.java
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;//此处省略Dog类的bean实现,只有两个简单的属性{name:steven,age:2}

    @Override
    public String toString() {
        return "Person [lastName=" + lastName + ", age=" + age + ", boss="
                + boss + ", birth=" + birth + ", maps=" + maps + ", lists="
                + lists + ", dog=" + dog + "]";
    }
    //此处省略get set 方法
    ...
  • application.yml
person:
    lastName: zhansan
    age: 18
    boss: false
    birth: 2017/12/12
    maps: {k1: 12,k2: 12}
    lists:
        - lisi
        - wangwu
    dog:
        name: steven
        age: 2
  • Test.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class Test{

    @Autowired
    Person person;

    @Test
    public void contextLoads() {
        System.out.println(person);
    }

}

//Person{lastName='zhansan', age=18, boss=false, birth=Tue Dec 12 00:00:00 CST 2017, 
//maps={k1=12, k2=12}, lists=[lisi, wangwu], dog=Dog{name='steven', age=2}}

        这个简单的demo就完成了,也得到了我们期望的结果,其中最重要的是@ConfigurationProperties,@Component这两个注解。

  • @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
  • @ConfigurationProperties(prefix = "person"):默认从全局配置文件中获取值;
  • prefix = "person":配置文件中哪个(person)下面的所有属性进行一一映射;

  • 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能; 所有我们为Person类加上@Component注解

4.自动配置原理

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

SpringBoot启动类
SpringBootApplication

2.@EnableAutoConfiguration 作用:利用EnableAutoConfigurationImportSelector给容器中导入一些组件

EnableAutoConfiguration
    EnableAutoConfigurationImportSelector在1.5中已经弃用,这里我们不深究,看到它的父类AutoConfigurationImportSelector中的selectImports方法
selectImports
         List configurations = getCandidateConfigurations(annotationMetadata, attributes);获取候选的配置

3.getCandidateConfigurations()方法调用了SpringFactoriesLoader.loadFactoryNames()方法,下面我们具体来看看这个方法的实现

getCandidateConfigurations方法
loadFactoryNames方法
这里写图片描述
         扫描所有jar包类路径下 META‐INF/spring.factories;
        把扫描到的这些文件的内容包装成properties对象;
        从properties中获取到EnableAutoConfiguration.class类(类名)对应的值,然后把他们添加在容器中;
        即将 类路径下 META-INF/spring.factories里面配置的所有EnableAutoConfiguration的值加入到了容器中。

4..META-INF/spring.factories内容

spring.factories位置

# 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.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

5.具体分析HttpEncodingAutoConfiguration原理

@Configuration
@EnableConfigurationProperties(HttpEncodingProperties.class)
@ConditionalOnWebApplication
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {

    private final HttpEncodingProperties properties;

    public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
        this.properties = properties;
    }

    @Bean //给容器中添加一个组件,这个组件的某些值需要从properties中获取,properties中的个属性是和配置文件绑定的。
    @ConditionalOnMissingBean(CharacterEncodingFilter.class)//容器没有CharacterEncodingFilter组件时生效
    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;
    }
}
  • @Configuration : 定义配置类。
  • @EnableConfigurationProperties(HttpEncodingProperties.class):启动指定类的ConfigurationProperties功能;
    将配置文件中对应的值和HttpEncodingProperties绑定起来;并把HttpEncodingProperties加入到ioc容器中。
  • `@ConditionalOnWebApplication:判断当前应用是否是web应用,如果是,当前配置类生效
  • @ConditionalOnClass(CharacterEncodingFilter.class)`:判断当前项目有没有这个类,CharacterEncodingFilter:SpringMVC中解决乱码的过滤器。
  • @ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)://判断配置文件中是否存在某个配置 spring.http.encoding.enabled;matchIfMissing表示,即使我们配置文件中不配置spring.http.encoding.enabled=true,也是默认生效的;
  • @Conditional注解(Spring注解版),条件注解,通过判断类路径下有没有相应配置的jar包来确定是否加载和自动配置这个类。
  • 所有在配置文件中能配置的属性都是在xxxxProperties类中封装的,配置文件的配置项就可以参照其对应的这个属性类。
//从配置文件中获取指定的值和bean的属性进行绑定
@ConfigurationProperties(prefix = "spring.http.encoding")
public class HttpEncodingProperties {

    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
    ...
}
小结:
1)、SpringBoot启动会加载大量的自动配置类;
2)、首先检查SpringBoot默认的自动配置类是否满足我们的需求;
3)、具体查看这个自动配置类中配置了哪些组件;
4)、给容器中的自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可以在配置文件中指定这
些属性的值;
5)、xxxxAutoConfigurartion:自动配置类,给容器中添加组件;xxxxProperties:封装配置文件中相关属性;

6.@Conditional派生注解了解

核心:@Conditional指定的条件成立,才给容器中添加组件,配置类里面的所有内容才生效;即,自动配置类必须在一定的条件下才能生效;

@ConditionalOnJava:系统的java版本是否符合要求
@ConditionalOnBean:容器中存在指定Bean;
@ConditionalOnMissingBean :容器中不存在指定Bean;
@ConditionalOnExpression :满足SpEL表达式指定
@ConditionalOnClass :系统中有指定的类
@ConditionalOnMissingClass: 系统中没有指定的类
@ConditionalOnSingleCandidate :容器中只有一个指定的Bean,或者这个Bean是首选Bean
@ConditionalOnProperty:系统中指定的属性是否有指定的值
@ConditionalOnResource :类路径下是否存在指定资源文件
@ConditionalOnWebApplication :当前是web环境
@ConditionalOnNotWebApplication :当前不是web环境

查看生效的配置类:
启用 debug=true属性,来查看控制台打印的自动配置报告。

=========================
AUTO-CONFIGURATION REPORT
=========================


Positive matches://匹配成功,启用的自动配置类
-----------------

   DispatcherServletAutoConfiguration matched:
      - @ConditionalOnClass found required class 'org.springframework.web.servlet.DispatcherServlet'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)
      - @ConditionalOnWebApplication (required) found StandardServletEnvironment (OnWebApplicationCondition)

   DispatcherServletAutoConfiguration.DispatcherServletConfiguration matched:
      - @ConditionalOnClass found required class 'javax.servlet.ServletRegistration'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)
      - Default DispatcherServlet did not find dispatcher servlet beans (DispatcherServletAutoConfiguration.DefaultDispatcherServletCondition)
    ...
    ...
    ...

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' (OnClassCondition)

    ...
    ...

猜你喜欢

转载自blog.csdn.net/try_try_try/article/details/80500211