SpringBoot笔记-01

配置文件

SpringBoot默认使用两种方式的全局配置文件,配置文件的名字是固定的

  • application.properties
  • application.yml

作用:用于修改SpringBoot自动配置的默认值

yaml

yaml的语法

YAML是"YAML Ain't a Markup Language"(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。

yaml与Json和Xml比起来更适合作为配置文件

server:
  port: 8081
  • 基本语法

    • key: value 冒号后面的空格不能少

    • 以空格缩进来控制层级关系,只要是左对齐的数据都是同一层级的

      server:
        port: 8081
        path: /hello
  • 值的写法

    • 字面量

      字面量直接写即可,字符串不用加上单引号或者双引号

      • 双引号:不会转义字符里面的特殊字符,特殊字符会作为本身想要表达的意思
      • 单引号:会转义特殊字符,特殊字符最终只是一个普通的字符串数据
    • 对象(属性和值),Map(键值对)

      在下一行写对象的属性和值的关系,缩进要对齐

      account:
        username: jack
        age: 20

      行内写法:

      account: {username: jack,age: 20}
    • 数组(List,Set)

      - 值来表示其中的一个元素

      pets:
          - dog
          - cat

      行内写法:

      pets: [cat,dog]

配置文件值注入

  • 导入依赖

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

    导入配置文件处理器后,以后编写配置就会有相应的提示

  • yaml

    server:
      port: 8081
    
    person:
      lastName: zhangsan
      age: 18
      boss: false
      birth: 2017/12/13
      maps: {k1: v1,k2: 12}
      lists:
        - lisi
        - liuwu
      dog:
        name: 小狗
        age: 3
  • javaBean

    package com.oylong.bean;
    
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;
    
    import java.util.Date;
    import java.util.List;
    import java.util.Map;
    
    @ConfigurationProperties(prefix = "person")
    @Component
    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;
    
        public String getLastName() {
            return lastName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public Boolean getBoss() {
            return boss;
        }
    
        public void setBoss(Boolean boss) {
            this.boss = boss;
        }
    
        public Date getBirth() {
            return birth;
        }
    
        public void setBirth(Date birth) {
            this.birth = birth;
        }
    
        public Map<String, Object> getMaps() {
            return maps;
        }
    
        public void setMaps(Map<String, Object> maps) {
            this.maps = maps;
        }
    
        public List<Object> getLists() {
            return lists;
        }
    
        public void setLists(List<Object> lists) {
            this.lists = lists;
        }
    
        public Dog getDog() {
            return dog;
        }
    
        public void setDog(Dog dog) {
            this.dog = dog;
        }
    
        @Override
        public String toString() {
            return "Person{" +
                    "lastName='" + lastName + '\'' +
                    ", age=" + age +
                    ", boss=" + boss +
                    ", birth=" + birth +
                    ", maps=" + maps +
                    ", lists=" + lists +
                    ", dog=" + dog +
                    '}';
        }
    }
    • @ConfigurationProperties:告诉SpringBoot将本类中所有的属性和配置文件中相关的配置进行绑定
    • @Componetn:表示将此类加载到容器中
  • 自动注入Person对象即可使用

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

properties配置文件

上述的yaml配置文件也可以使用properties配置文件来代替,如下

person.last-name=张三
person.age=20
person.birth=2019/10/10
person.boss=false
person.maps.k1=v1
person.maps.k2=20
person.lists=a,b,c,d,e
person.dog.name=dog
person.dog.age=10

但是输出后会有中文乱码的现象,需要在idea中设置propeties的编码,之后即可正常输出

properties编码

不使用@ConfigurationProperties注解来注入

我们也可以使用@Value注解来注入

...
//@ConfigurationProperties(prefix = "person")
@Component
public class Person {
    @Value("${person.last-name}")
    private String lastName;
    @Value("#{5*4}")
    private Integer age;

    @Value("true")
    private Boolean boss;
    private Date birth;
  ...

@Value@ConfigurationProperties的区别

@ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个个的制定
松散语法绑定 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持
  • 松散语法: 用-小写或者_小写代替大写
  • 如果只是在某个业务逻辑中需要获取某项值,使用@Value
  • 如果我们专门编写了一个javaBean来和配置文件进行映射,就直接使用@ConfigurationProperties

读取指定的配置文件

  • 我们可以使用@PropertySource注解来表示读取指定的某个配置文件
...
@PropertySource(value = {"classpath:person.properties"})
@ConfigurationProperties(prefix = "person")
@Component
public class Person {
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;
    private Map<String, Object> maps;
    private List<Object> lists;
  ...
  • 可以使用@ImportResource注解来导入Spring配置文件并让其生效

SpringBoot推荐的添加组件的方式:使用全注解的方式来配置

  • 添加配置类,并且用@Configuration注解表示它是一个配置类

  • 使用@Bean标签表示将方法的返回值添加到容器中,容器中这个组件默认id为方法名

    @Configuration
    public class MyConfig {
        @Bean
        public HelloService helloService() {
            return new HelloService();
        }
    }

配置文件的占位符

  • 随机数

    ${random.value}、${random.int}、${random.long} 2 ${random.int(10)}、${random.int[1024,65536]}

  • 占位符获取之前配置的值可以使用:来指定

    person.last‐name=张三${random.uuid} 2 person.age=${random.int}
    person.birth=2017/12/15
    person.boss=false
    person.maps.k1=v1
    person.maps.k2=14
    person.lists=a,b,c
    person.dog.name=${person.hello:hello}_dog 9 person.dog.age=15

profile多环境支持

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

  • 需要在主配置文件中激活配置,如有,application-dev.properties这个配置文件,则使用:

    spring.profiles.active=dev
  • 若使用yaml,则可以使用多文档块,使用---来分隔,如下

    spring:
      profiles:
        active: dev
    ---
    server:
      port: 8081
    ---
    spring:
      profiles: prod
    server:
      port: 8080
  • 使用命令行

    添加参数spring.profiles.active=dev运行即可

配置文件加载位置

  • springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件

    –file:./config/
    –file:./
    –classpath:/config/
    –classpath:/

    优先级由高到底,高优先级的配置会覆盖低优先级的配置;

    SpringBoot会从这四个位置全部加载主配置文件;互补配置;

  • 可以通过spring.config.location来改变默认的配置文件位置

最后修改:2020 年 03 月 28 日
如果觉得我的文章对你有用,请随意赞赏