• SpringBoot配置文件(1)


    配置文件

    1、配置文件

    SpringBoot使用一个全局的配置文件

    • application.properties
    • application.yml

    配置文件名是固定的;
    他的作用是修改SpringBoot自动配置的默认值。
    YAML a markup language:是一种标记语言
    YAML isn’t markup language:不是一种标记语言

    YAML以数据为中心,比json,xml更适合做配置文件;

    server:
        port:8081
    

    xml

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

    2、YAML基本语法

    1. 基本语法

    k:(空格)v: 表示一对键值对(空格必须有)
    以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一级的

    server:
        port:8081
        path:/hello
    

    属性和值也是大小写敏感

    2、值的写法

    字面量:就是普通的值(字符串,数字,布尔)

    k: v: 字面直接来写
    字符串默认不用加上单引号或双引号;
    “”:双引号:不会转义特殊字符;也就是说特殊字符会表示成想要的模样
    name: “zhangsan lisi”: 输出:zhangsan换行lisi
    ‘’: 单引号:回转仪特殊字符,特殊字符最终只是一普通的字符串
    name: ‘zhangsan lisi’
    输出:zhangsan lisi

    对象、map(属性和值)(键值对):

    k:v 在k的下一行写对象的属性和值,注意缩进
    对象还是k:v的方式

    friends:
       lastName:zhangsan
       age:20
    

    行内写法

    friends: {lastName: zhangsan,age:18}
    

    数组(List,Set)

    pets:
     - cat
     - dog
     - pig
    

    行内写法

    pets:[cat,dog,pig]
    

    3、配置文件的值注入

    配置文件application.yml 属性

    # 配置person
    person:
      name: zhangsan
      boss: false
      list:
      - lisi
      - tom
      - jerry
      map: {k1: v1,k2: v2}
      dog:
        name: wangwang
        age: 2
      age: 16
      birthday: 2020/1/26
    

    相关的javaBean 类

    /**
     * ConfigurationProperties注解的作用是将配置文件中的相关配置与
     * 配置这个注解的组件的属性进行一一映射
     * 
     * prefix = "person" 从application.yml中找前缀是person的属性
     */
    @Component
    @ConfigurationProperties(prefix = "person")
    public class Person {
        private Date birthday;
        private String name;
        private Integer age;
        private List<String> list;
        private Map<String,Object> map;
        private Dog dog;
        private boolean boss;
    
    public class Dog {   
    private String name;   
    private Integer age;
    
    

    pom.xml中需要导入的configuration依赖,可以帮助减少属性注入时出错,他会在写配置时提示对应组件的相关属性

    <dependency>         
     	<groupId>org.springframework.boot</groupId> 
      	<artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
    

    SpringBoot测试

    @SpringBootTest
    class QuickstartApplicationTests {
    
        @Autowired
        Person person;
        @Test
        void contextLoads() {
            System.out.println(person);
        }
    
    }
    
    

    测试结果:
    Person
    {birthday=Sun Jan 26 00:00:00 CST 2020, name=‘zhangsan’,
    age=22,
    list=[lisi, tom, jerry],
    map={k1=v1, k2=v2}, dog=Dog{name=‘wangwang’, age=2}, boss=false}

    在properties文件中设置对象属性

    person.age=19
    person.birthday=2020/2/16
    person.boss=false
    person.dog.age=2
    person.dog.name=dog
    person.name=张三
    person.list=d1,d2,d3
    person.map.k1=v1
    person.map.k2=v2
    
    

    需要注意的是:*.properties文件默认编码是GBK,但是idea默认编码是UTF-8编译,所以要将配置文件的编码格式改为UTF-8,并且当有中文时转为GBK编码

    输出结果:
    Person{birthday=Sun Feb 16 00:00:00 CST 2020, name='张三', age=19, list=[d1, d2, d3], map={k1=v1, k2=v2}, dog=Dog{name='dog', age=2}, boss=false}

    2、@Value获取值和@ConfigurationProperties获取值比较

    @ConfigurationProperties@Value
    功能批量注入配置文件中的属性需要一个个指定
    松散绑定支持不支持
    Spel不支持支持
    JSR303数据校验支持不支持
    复杂类型封装支持不支持

    总结:无论是yml配置文件还是properties文件都可以获取到值,如果我们需要在业务逻辑中获取文件的某个值,那就用@Value,一般情况下用@ConfigurationProperties配置文件注入值。

    4、@PropertySource&@ImportResource

    @PropertySource可以加载指定的配置文件。
    这次我们不在默认的application.properties文件中设置person的属性值,我们在resources目录下再创建一个person.properties文件。那怎样把这个配置文件中所设置的属性注入到组件中呢?

    @PropertySource(value = {"classpath:person.properties"})
    @Component
    @ConfigurationProperties(prefix = "person")
    public class Person {
        private Date birthday;
        private String name;
        private Integer age;
        private List<String> list;
        private Map<String,Object> map;
        private Dog dog;
        private boolean boss;
    
    

    @PropertySource(value = {“classpath:person.properties”})

    person.age=19
    person.birthday=2020/2/16
    person.boss=false
    person.dog.age=2
    person.dog.name=dog
    person.name=李四
    person.list=d1,d2,d3
    person.map.k1=v1
    person.map.k2=v2
    
    

    我们注释掉原来在application.properties的属性

    运行输入结果:
    Person{birthday=Sun Feb 16 00:00:00 CST 2020,
    name=‘李四’,
    age=19, list=[d1, d2, d3], map={k2=v2, k1=v1}, dog=Dog{name=‘dog’, age=2}, boss=false}
    也就是说配置没有问题。

    @ImportResource:导入Spring的配置文件,让配置文件中的内容生效;
    SpringBoot里面没有Spring的配置文件,我们自己创建的Spring xml不能被识别。

    例如,我现在创建一个beans.xml,里面放一个bean,现在什么都不做,测试一下IOC容器中有没有这个javaBean。

    <?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="cn.edu.nyist.quickstart.service.HelloService"></bean>
    </beans>
    
     @Autowired
        ApplicationContext ioc;
    
        @Test
        void testHelloService() {
            boolean b = ioc.containsBean("helloService");
            System.out.println(b); //false
        }
    

    想让Spring的配置文件生效,只需在配置类上标注@ImportResource注解

    @ImportResource(locations = {"classpath:beans.xml"})
    @SpringBootApplication
    public class QuickstartApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(QuickstartApplication.class, args);
        }
    
    }
    
    

    然后再测试输出
    true,也就是在beans.xml 中的组件已经成功的交给IOC容器了。

    SpringBoot推荐给容器中添加组件的方式是使用全注解的方式。

    @Configuration: 指明当前类是一个配置类,就是替代原来的Spring配置文件

    @Bean注解

    @Configuration
    public class MyConfig {
    
        @Bean  
        public HelloService helloService(){ // 默认生成的bean的id就是方法名
            System.out.println("@Bean给IOC配置 HelloService");
            return new HelloService();
        }
    }
    
    

    /默认生成的bean的id就是方法名
    控制台输出
    @Bean给IOC配置 HelloService
    true

    4、配置文件占位符

    可以使用随机数

    ${random.value}, ${random.int}、${random.long}, ${random.int(10)}, ${random.int(1024,65535)}

    2、占位符获取之前配置的值
    person.age=${random.int}
    person.birthday=2020/2/16
    person.boss=false
    person.dog.age=2
    person.dog.name=${person.name:hello}_dog
    person.name=张三_${random.uuid}
    person.list=d1,d2,d3
    person.map.k1=v1
    person.map.k2=v2
    
    

    输出

    Person
    {birthday=Sun Feb 16 00:00:00 CST 2020, name='张三_87ee8799-7bf3-4282-9334-1916d0f31643', 
    age=-899833181, 
    list=[d1, d2, d3], 
    map={k1=v1, k2=v2}, 
    dog=Dog{name='张三_ae5ea0bf-0242-4376-9276-5ebbfb969866_dog', 
    age=2}, 
    boss=false}
    
    

    5、Profile

    1.多Profile文件

    我们在主配置文件中编写的时候,文件名可以是 application-{profile}.properties/yml
    文件名
    默认使用application.properties配置文件中的设置。

    2、yml支持多文档方式
    # 第一个文档快
    spring:
      profiles:
        active: prod #激活prod环境的端口号
    server:
      port: 8080
    ---
    # 第二个文档快
    server:
      port: 8082
    spring:
      profiles: dev
    ---
    # 第3个文档快
    server:
      port: 8083
    
    spring:
      profiles: prod
    ---
    # 第4个文档快
    
    
    3、激活指定的profile

    需要指定其他profile中的端口号时,

    spring.profiles.active=prod
    # prod指的是生产环境,dev,是开发环境的简写
    

    application-prod.properties中指定的端口号是
    server.port=8090

    第二种方式

    在idea 运行/调试配置中
    找到program args:输入
    --spring.profiles.active=dev
    在这里插入图片描述
    然后保存,运行,这时的环境配置就是dev环境下的内容,当然端口号也变成了8082

    第三种方式

    在idea中还是运行/调试配置,
    点击编辑配置就进来了
    还是上面的那个界面
    这次设置虚拟机参数
    在这里插入图片描述
    输入-Dspring.profiles.active=dev
    这时也能切换到指定环境。

    刚开始学,有不足之处,还请大佬们指出
    待续…

  • 相关阅读:
    最小乘积(基本型)
    删除数组零元素
    大小写转换
    矩阵乘法
    字串统计
    出现次数最多的整数
    Anagrams问题
    前缀表达式
    2的次幂表示
    POJ
  • 原文地址:https://www.cnblogs.com/itjiangpo/p/14181428.html
Copyright © 2020-2023  润新知