zoukankan      html  css  js  c++  java
  • 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
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    Android开发 ViewConfiguration View的配置信息类
    Android 开发 倒计时功能 转载
    Android 开发 关于7.0 FileUriExposedException异常 详解
    Android 开发 实现文本搜索功能
    Android 开发 Activity里获取View的宽度和高度 转载
    Android 开发 存储目录的详解
    Android 开发 Fresco框架点击小图显示全屏大图实现 ZoomableDraweeView
    Android 开发 将window变暗
    Android 开发 DisplayMetrics获取Android设备的屏幕高宽与其他信息
    Android 开发 DP、PX、SP转换详解
  • 原文地址:https://www.cnblogs.com/Jeremy2001/p/10477699.html
Copyright © 2011-2022 走看看