spring boot配置(一)

配置文件

spring boot使用一个全局配置文件(文件名固定),分两种application.propertiesapplication.yml,用于修改spring boot自动配置的默认值。

YAML(YAML Ain't Markup Language)

标记语言:

  • 以前的配置文件大多使用xml文件
  • YAML以数据为中心,比json、xml等更适合做配置文件

基本语法:

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

属性和值大小写敏感
值得写法:

  • 字面量:普通的值(数字、字符串、布尔)
    k: v :字面直接来写;字符串默认不用加上单引号或者双引号;
    "" 双引号:不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思。
    name:"zhangsan\n lisi": 输出:zhangsan换行 lisi
    '' 单引号:会转义特殊字符,特殊字符最终只是一个普通的字符串数据。
    name: 'zhangsan\n lisi':输出:zhangsan \n lisi
  • 对象、Map:
    k: v : 在下一行写对象的属性和值的关系
    对象还是k: v的形式
    friends:
      lastName: zhangsan
      age: 20
    
    行内写法
    friends: {lastName: zhangsan,age: 18}
    
  • 数组(List、Set):用-值表示数组中的元素
    pets:
      - cat
      - dog
      - pig
    
    行内写法
    pets: {cat,dog,pig}
    

实例:配置文件值注入
在bean包下创建两个javabean,PersonDog

  • javabean
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;

(将配置文件中配置的每个属性值映射到这个组件中)
@ConfigurationProperties(prefix = "person"):该注解告诉spring boot将本类中的所有属性和配置文件中相关的配置进行绑定;prefix = "person"指定配置文件下哪个标签下面的属性进行一一映射。
@Component:标注这是一个组件,只有容器中的组件才能使用容器提供的@ConfigurationProperties功能。

  • 配置文件
person:
  lastName: zhangsan
  age: 18
  boss: false
  birth: 2019/2/1
  maps: {k1: v1,k2: 18}
  lists:
    - lisi
    - lili
  dog:
    name: 小狗
    age: 12
  • 配置文件处理器
    IDE提醒添加的依赖,这样在配置文件中编写代码时就有提示了
    
        org.springframework.boot
        spring-boot-configuration-processor
        true
    

@ConfigurationProperties和@Value

@Value用法:

public class Person {
    @Value("小明")  //直接赋值
    private String lastName;
    @Value("#{11 * 2}")     //表达式
    private Integer age;
    @Value("${person.boss}")    //从配置文件中获取值
    private Boolean boss;
    private Date birth;

使用@Value需要在javabean中一个一个配置。

. @ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个一个配置
松散绑定(松散语法) 支持 不支持
SpEL(表达式) 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持
  • 松散绑定:形如person.last-name,用 - 代替驼峰
  • JSR303数据校验
    @Validated
    public class Person {
        @Email   //指定只能赋Email格式的值
        @Value("${person.lastName}")
        private String lastName;
    
  • 复杂类型封装:@Value无法配置Map、List等复杂类型的属性

小结:

  • 如果只是要用一个配置文件中的某个值,则用@Value
  • 如果写了个javabean来和配置文件中的属性进行绑定,则用@ConfigurationProperties

@PropertySource和@ImportResource

  • @PropertySource
    @ConfigurationProperties注解默认使用全局配置文件对JavaBean进行配置,而@PropertySource注解可以指定一个配置文件来为JavaBean配置。
    @PropertySource(value = {"classpath:person.properties"})
    @Component
    @ConfigurationProperties(prefix = "person")
    public class Person {
    

只支持.properties文件)

  • @ImportResource
    导入spring的配置文件,让配置文件里的内容生效;
    spring boot中没有spring的配置文件,它无法识别我们编写的配置文件,因此需要在主配置类上使用@ImportResource将spring配置文件加载进来
    @ImportResource(locations = {"classpath:beans.xml"})
    @SpringBootApplication
    public class ConfigurationApplication {
    

spring boot推荐使用全注解的方式添加组件

  • 用配置类代替spring配置文件
  • @Bean将对象添加到容器中
    如下是一个配置类
/**
 * @Configuration  指明该类是一个配置类,替代了之前spring的配置文件
 * 以前使用添加组件
 */
@Configuration
public class MyAppConfig {
    @Bean   //将方法返回值添加到容器中,默认id是方法名
    public HelloService helloService(){
        return new HelloService();
    }
}

配置文件的占位符

person.lastName = 李四${random.int}
person.age = ${random.int}
person.boss = false
person.birth = 2017/12/12
person.maps.k1 = v1
person.maps.k2 = 12
person.lists = lisi,zhaoliu
person.dog.name = ${person.lastName}_小狗
person.dog.age = 2

${}可以用于获取之前配置过的值,如person.dog.name = ${person.lastName}_小狗
如果没有值,可以指定默认值,如person.dog.name = ${person.lastName:李四}_小狗

你可能感兴趣的:(spring boot配置(一))