• springboot配置文件详解


    https://blog.csdn.net/myvanguard/article/details/84844583

    简介

    springboot的默认配置文件

    application.properties
    application.yml
    yaml是标记语言,是以数据为中心的的配置文件


    server:
    port:8081

    1
    2
    3
    4
    2.yaml语法
    1.基本语法
    k:(空格v:表示一对键值对(空格必须有)
    以空格的缩进来控制层级关系:只要左对齐的一列数据,都是同一个层级


    server:
    port:8080
    path:/path

    1
    2
    3
    4
    5
    2.值的写法
    字面量:普通的值(数字,字符串,布尔值)
    K:V:字面直接来写
    字符串不需要使用双引号或者单引号
    “”:会转义特殊字符 “ ” 输入 换行
    ‘’:不会转义特殊字符 ‘ ’ 输出还是

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


    friend:
    name:zhangsan
    age:12

    行内写法

    friend: {name:zhangsan,age:18}
    1
    2
    3
    4
    5
    6
    7
    8
    数组(list,set)
    使用-值 表示数组中的一个元素


    pets:
    - cat
    - dog
    - pig

    行内写法
    pets: [cat,dog,pig]
    1
    2
    3
    4
    5
    6
    7
    8
    3.配置文件注入

    person:
    lastName: zhangsan
    age: 18
    boss: false
    birth: 2017/01/01
    maps: {k1:v1,k2:12}
    lists:
    - lisi
    - zhaoliu
    dog:
    name: 小狗
    age: 2

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    /**
    * 将配置文件中的配置的每一个属性的值 映射到这个组件在
    * @ConfigurationProperties 告诉springboot将本类中的所有的属性和配置文件中的有关的配置进行绑定
    * prefix = "person" 配置文件中的哪一个下面的所有属性进行映射
    *
    * 只有这个组件是容器中的组件 才能提供@ConfigurationProperties 的值
    */
    @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;


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    pom.xml文件添加配置文件处理器


    <!--导入配置文件处理器 配置文件绑定就会有提示-->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
    </dependency>

    1
    2
    3
    4
    5
    6
    7
    8
    1.peroperties文件的写法


    server.port=8081
    #idea 的properties文件 默认使用utf-8
    #peroperties文件使用的ascii编码
    #配置person的值
    person.last-name=张三
    person.age=18
    person.birth=2017/01/01
    person.boss=false
    person.maps.k1=v1
    person.maps.k2=12
    person.lists=a,b,c
    person.dog.name=dog
    person.dog.age=2


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    idea 针对properties文件需要作出一点配置

    2.@Value()注解和@ConfigurationProperties注解的区别

    @ConfigurationProperties 批量注入,支持松散语法,不知springEL表达式,支持数据校验,支持复杂数据封装

    @Value 支持springEL表达式

    如果只是获取配置文件的一项值 使用@Value


    @Value("${person.last-name}")
    private String name;

    @RequestMapping("/sayHello")
    public String sayHello(){
    return "say"+name;
    }


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    如果是javabean 使用@ConfigurationProperties

    3.配置文件数据校验


    @Component
    @ConfigurationProperties(prefix = "person")
    //数据校验
    @Validated
    public class Person {

    /**
    * 使用@Value注解 从字面量/${key}#{SpEL}等语法中获取
    */
    //@Value("${person.last-name}")
    //lastName必须是邮件地址
    @Email
    private String lastName;


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    4.@PropertySource 和@ImportResource
    @PropertySource 导入指定的配置文件

    //value = {"a","b"}
    @PropertySource(value = {"classpath:person.properties"})

    1
    2
    3
    @ImportResource 导入spring的配置文件 让配置文件的内容生效

    @ImportResource 标注在一个配置类


    @ImportResource(value = {"classpath:beans.xml"})

    1
    2
    3
    springboot里面推荐给容器中添加组件的方式 使用配置类 使用全注解的方式

    1、使用@Configuration来声明一个注解类

    2、使用@Bean来给容器中添加组件


    /**
    * @Configuration 指明当前类是一个配置类 代替原来的xml配置bean的方式
    */
    @Configuration
    public class MyAppConfig {

    //将方法的返回值添加到容器中
    @Bean
    public HelloService helloService(){
    return new HelloService();
    }
    }


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    4.配置文件占位符

    1.随机数

    ${random.value} ${random.int} ${random.long}
    ${random.int(10)} ${random.int[1024,666]}


    1
    2
    3
    4
    2.占位符 获取配置的值 如果没有 则取默认值 :后

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

    1
    2
    5.profile

    是spring针对不同环境的不同配置

    1.多profile文件
    appliction-{profile}.properties/yml
    比如
    application-dev.properties
    application-test.properties

    2.yml支持文档块方式


    server:
    port: 8081
    spring:
    profiles:
    active: prod
    ---


    server:
    port: 8080
    spring:
    profiles: prod
    ---
    server:
    port: 8083
    spring:
    profiles: dev

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    3.激活指定的profile

    方式1 在指定配置文件中指定profile spring.profiles.active==dev

    方式2 java -jar demo.jar --spring.profiles.active=dev

    方式3 虚拟机参数 -Dspring.profiles.active=dev

    6.加载配置文件位置优先级

    4个application.properties的优先级 由高到低 依次加载 依次覆盖

    1>2>3>4

    可以通过spring.config.location=C:/application.properties 来修改默认配置,使用指定配置文件

    7外部配置文件的加载顺序

    springboot可以按照以下的文件位置加载配置 由高到低 互补配置

    命令参数 java -jar demo.jar --server.port=8087
    java系统参数
    系统环境变量
    优先加载带profile的配置文件 都是有jar包外往jar包内加载配置文件

    8.springboot自动配置原理

    1.配置文件的属性 --参照官方文档

    自动配置原理
    1.springboot启动的时候加载主配置类,而且开启了自动配置功能@EnableAutoConfiguration
    2.@EnableAutoConfiguration作用

    利用EnableAutoConfigurationImportSelector给容器导入一些组件
    可以添加组件的方法selectImports()方法的内容
    List configurations = geCandidateConfigurations(AnotationMetadata,attributes);//获取候选的配置
    扫描jar包,把扫描到的内容META-INF/spring.properties包装为properties对象
    从properties对象获取类名对应的值 然后添加到容器中
    3.每一个自动配置类XXXAutoConfiguration进行自动配置功能

    4.以HttpEncodingAutoConfiguration解释自动配置原理


    @Configuration //这是一个配置类 即为配置文件 可添加组件@EnableConfigurationProperties({HttpProperties.class})//启用指定类的ConfigurationProperties 将配置文件中对应的值和HttpEncodingProperties绑定起来
    把HttpEncodingProperties加入到ioc容器中

    @ConditionalOnWebApplication(
    type = Type.SERVLET
    )//spring底层@Conditional注解 根据不同的条件 如果满足指定的条件 整个配置类里面的配置就会生效 判断当前应用是web应用 如果是 当前配置类生效
    @ConditionalOnClass({CharacterEncodingFilter.class})//判断当前有没有这个类CharacterEncodingFilter springMVC的乱码过滤器
    @ConditionalOnProperty(
    prefix = "spring.http.encoding",
    value = {"enabled"},
    matchIfMissing = true
    )//判断配置文件中是否存在某个配置 如果不存在 也是成立的
    //即使不配置 也是默认生效的
    public class HttpEncodingAutoConfiguration {

    //和springboot的配置文件映射了
    private final 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(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.REQUEST));
    filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.RESPONSE));
    return filter;
    }


    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
    根据当前不同的条件判断决定这个配置类是否生效?

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

    5 所有在配置文件中能够配置的属性都是在xxxproperties文件中封装了


    @ConfigurationProperties(
    prefix = "spring.http"
    )//从配置文件中获取指定的值和bean的属性进行绑定
    public class HttpProperties {


    1
    2
    3
    4
    5
    6
    7
    springboot精髓
    1.springboot启动会加载大量的自动配置类
    2.我们需要的功能有没有springboot默认写好的自动配置类
    3.我们再看自动配置类配置了那些组件 只要我们要用的组件有 就不需要配置了
    4.给容器自动配置组件的时候 会从properties文件类获取某些属性。我们可以在配置文件中指定这些属性的值

    9.@Conditional派生注解

    作用是:必须是@Conditional指定的条件生效 才给容器中添加组件 配置的所有内容才会生效

    自动配置类 只有在一定条件上才会生效

    我们如何判断哪些自动配置类生效?

    在properties/yml中添加
    debug=true#开启springboot的debug

    我们可以通过启用debug=true 来让控制台打印自动配置报告 知道哪些生效了
    ---------------------
    作者:学习急先锋
    来源:CSDN
    原文:https://blog.csdn.net/myvanguard/article/details/84844583
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    HDU 4578
    Luogu 3373
    HDU 6343
    2018牛客网暑期ACM多校训练营(第五场) F
    2018牛客网暑期ACM多校训练营(第五场) E
    2018牛客网暑期ACM多校训练营(第四场) A
    POJ 3580
    HDU 1890
    ZOJ 4029
    2018牛客网暑期ACM多校训练营(第三场) H
  • 原文地址:https://www.cnblogs.com/Jeremy2001/p/10477699.html
Copyright © 2020-2023  润新知