二、Spring Boot配置

1.配置文件

SpringBoot使用一个全局配置文件,配置文件名是固定的:

  • ​ application.properties
  • ​ application.yml

配置文件作用:修改SpringBoot自动配置的默认值;

YAML(YAML Ain’t Markup Language):YAML不是一种标记语言

标记语言:

​ 以前是xml

​ 现在是yaml,以数据为中心,比json、xml更适合做配置文件;

server:
  port: 8081

XML

<server>
	<port>8081</port>
</server>

2.YAML语法

a.基本语法

k: v:表示一对键值对(空格必须有);

以空格的缩进表示层级关系,只要是左对齐,都为同一层的;

server:
	port: 8010
	path: /hello

b.值的写法

字面量:数字、字符串、布尔----直接来写,字符串不用加引号

​ “”:双引号,不会转义字符串里面的特殊字符,特殊字符作为本身的意思输出;

​ name:“zhansan \n lisi” 输出:zhangsan 换行 lisi

​ ‘’:单引号,会转义特殊字符,最终转为一个普通字符串数据

对象、Map:

K: V 在下一行写对象属性和值的关系;注意缩进

friends:
	lastname: zhangsan
	age: 20

行内写法:

friends: {lastname: zhangsan,age: 20}

数组(list、set)

用- 值表示数组中一个元素

pets:
 - cat
 - dog

行内写法:

pets: [cat,dog]

3.配置文件注入

yaml配置文件

person:
  lastname: zhangsan
  lists:
    - cat
    - dog

a.ConfigurationProperties

javaBean

/**
 * @author DaXia_Hao
 * @date 2019/7/18 0018 9:41
 * 将配置文件中属性映射到这个组件中
 * @ConfigurationProperties
 * (prefix = "person")配置文件中哪个下面的所有属性进行映射
 *
 * 只有这个组件是容器的组件,才能容器提供@ConfigurationProperties功能
 **/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {

    private String lastname;
    private List<Object> lists;

导入配置文件处理器,可以提升输入配置文件

 <!--导入配置文件处理器-->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-configuration-processor</artifactId>
     <optional>true</optional>
 </dependency>

b.value

public class Person {

    @Value("${person.last-name}")
    private String lastname;
    @Value("#{11*2}")
    private Integer age;

@value获取值和@ConfigurationProperties获取值比较

@ConfigurationProperties@value
功能批量注入配置文件中属性一个个指定
松散绑定(大小写)支持last_name --> lastName不支持
SpEL不支持支持@Value("#{11*2}")
JSR303数据校验支持不支持
复杂类型封装支持不支持

如果我们只是在某个业务逻辑获取配置文件中某个值,一般用@value!!

JSR303数据校验

@Validated
public class Person {

    @Email
    private String lastname;

c.PropertySource

@PropertySource(value = {“classpath:person.properties”}) 加载指定配置文件;

d.ImportResource

目的:导入Spring的配置文件,让配置文件里面的内容生效;

Spring Boot里面没有Spring配置文件,我们自己编写配置文件,不能自动识别;

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="helloService" class="club.eryastudio.springboot02config.service.helloService">
    </bean>
</beans>

若想生效,@ImportResource(locations = {“classpath:bean.xml”})标注在一个配置类上;

@ImportResource(locations = {"classpath:bean1.xml"})
@SpringBootApplication
public class SpringBoot02ConfigApplication {

Spring Boot推荐方式

1.配置类

2.@Bean

/** 
@Configuration 指明当前类是一个配置类,用来代替spring的配置文件bean.xml
 在配置文件汇总用<bean></bean>标签添加组件**/

@Configuration
public class MyAppConfig {

    //将方法的返回值添加到容器中:容器中这个组件的默认id就是方法名
    @Bean
    public helloService hello(){
        return new helloService();
    }
}

4.配置文件占位符

1.随机数

${random.value} ${random.int}

2.占位符获取之前配置的值,如果没有可以是用:指定占位符

person.dog.name = ${person.hello:hello}_dog

5.Profile

1.多profile文件

提供多环境支持,可以通过激活指定参数等方式, 快速切换环境;

文件名是 application-{profile}.properties/yml

#默认使用application.properties
#application-dev.properties
spring.profiles.active=dev

2.yml支持多文档块方式

省去写多个文档!

server:
	port: 8081
spring:
	profiles:
		active: dev
	
	
---
server:
	port: 8083
spring:
	profiles: dev
	
	
---
server:
	port: 8084
spring:
	profiles: prod

3.激活指定profile

​ a.在配置文件中指定spring.profiles.active=dev

​ b.命令行激活 --spring.profiles.active=dev

6.配置文件加载位置

application.yml作为默认boot配置文件,按照优先级从高到低排序,所有位置文件都会被加载,高优先级覆盖低优先级;

  • file:./config/

  • file:./

  • classpath:/config/

  • classpath:/

spring.context-path=/boot #配置项目访问路径

spring.config.location= D:/application.yml #指定配置文件位置,项目已经打包好,使用命令行参数指定配置参数

7.自动配置原理

配置文件能写什么?怎么写?自动配置原理;

配置文件属性参照

1.自动配置原理:

a.SpringBoot启动加载主配置类,开启了自动配置功能**@EnableAutoConfiguration**

b.@EnableAutoConfiguration作用:

  • ​ 利用EnableAutoConfigurationImportSelector给容器导入一些组件?

  • ​ 可以插入selectImports()方法的内容;

  • ​ List configurations = getCandidateConfigurations(annotationMetadata, attributes);获取候选配置;

    SpringFactoriesLoader.loadFactoryNames()
        扫描所有jar包类路径下 META-INF/spring.factories
    把扫描到这些文件内容包装成properties对象  
    从properties中获取到EnableAutoConfiguration.class类对应的值,然后把他们添加在容器中
    

    将类路径下META-INF/spring.factories 配置的所有EnableAutoConfiguration值添加到容器中;

    # 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
    

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

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

    d.以HttpEncodingAutoConfiguration为例解释自动配置原理

    @Configuration  //表示这是一个配置类,以前编写的配置文件一样,也可以给容器中添加组件
    @EnableConfigurationProperties({HttpEncodingProperties.class})  //启动指定类的ConfigurationProperties功能,并把这个类加入到ioc容器中
    
    @ConditionalOnWebApplication //spring底层@Conditional注解,根据不同的条件,如果满足指定条件,整个配置类里面的配置就会生效;
    //判断当前应用是否为web,如果是,配置生效;
    @ConditionalOnClass({CharacterEncodingFilter.class})//判断是否有没有这个类,springmvc解决乱码过滤器;
    @ConditionalOnProperty(
        prefix = "spring.http.encoding",
        value = {"enabled"},
        matchIfMissing = true
    ) //判断配置文件中是否存在某个配置 spring.http.encoding,如果不存在,判断也是成立的
    
    public class HttpEncodingAutoConfiguration {
        
        //他已经和springboot配置文件映射了
         private final HttpEncodingProperties properties;
        
        @Bean    //给容器中添加组件,这个组件的某些值需要从properties中获取
        @ConditionalOnMissingBean({CharacterEncodingFilter.class})
        //判断容器中必须没有这个组件
        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;
        }
        
        
        根据当前不同的条件判断这个配置类是否生效?
            一但这个配置类生效,这个配置类就会给容器中添加各种组件,这些组件的属性就是从对应properties中获取的,这些类中每一个属性又是和配置文件绑定;
            
    public class HttpEncodingProperties {
    
        public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
        private Charset charset = DEFAULT_CHARSET;
        private Boolean force;
    

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

@ConfigurationProperties(prefix = "spring.http.encoding")//从配置文件中获取指定的值与本案进行绑定
public class HttpEncodingProperties {

	public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");

精髓:

1.springboot启动会加载大量的自动配置类

2.我们看需要的功能是否默认自动配置

3.我们看自动配置类到底配置了那些组件

4.给容器中自动配置类添加组件的时候,会从properties中获取某些属性,我们就会从配置文件中指定这些属性的值;

xxxAutoConfiguartion:自动配置类

给容器中添加组件

xxxProperties:封装配置文件

2.细节

@conditional

作用:必须是@conditional指定的条件成立,才给容器中添加组件,配置里面的内容才能生效;

​ @ConditionalOnMissingBean({CharacterEncodingFilter.class})//判断容器中必须没有这个组件

自动配置类必须在一定条件下才能生效

我们可以通过启动 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 'session' scope (OnWebApplicationCondition)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值