SpringBoot:4.springboot的配置

4.springboot的配置

springboot配置文件:该文件是一个全局配置文件,该配置文件的名称是固定的。

  • application.properties
    • 该文件的语法:key=value
  • application.yaml(优先级高于properties文件)
    • 该文件的语法:key: value 注冒号后面有空格

该文件的作用:springboot的自动配置,已经帮我们配置好了默认值,如果你需要修改就可以通过该配置文件修改默认值。

  • 例如

    ​ properties:server.port=8080

    ​ yaml:server:

    ​ port: 8080

该文件能配置什么?通过了解原理,可以知道他是如何配置的,能配置什么。

我们先了解yaml,再了解配置原理。

4.1yaml语法与核心配置文件的配置原理(application.yaml)

YAML是 “YAML Ain’t a Markup Language” (YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)

该标记语言以数据为中心,而不是以标记语言为中心!

对比xml和

xml配置:

<server>
    <port>8080</port>
</server>

yaml配置(对空格的要求十分高)

server:
	prot: 8080
#普通的key-value
name: ariverh
#对象
student:
	name: ariverh
	age: 22
#行内写法
student: {name: ariverh,age: 22}
#数组
pets:
	- cat
	- dog
pets: [cat,dog]

properties配置

server.port=8080

yaml可以配置类中的属性赋值,即注入配置类。

yaml可以给实体类赋值,即注入。

通过yaml给实体类赋值:

Cat类:

@Component
public class Cat {
    @Value("cat")
    private String name;
    @Value("1")
    private String age;

    public Cat() {
    }

    public Cat(String name, String age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                '}';
    }
}

Person类:

@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private Integer age;
    private Boolean happy;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Cat cat;

    public Person() {
    }

    public Person(String name, Integer age, Boolean happy, Date birth, Map<String, Object> maps, List<Object> lists, Cat cat) {
        this.name = name;
        this.age = age;
        this.happy = happy;
        this.birth = birth;
        this.maps = maps;
        this.lists = lists;
        this.cat = cat;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Boolean getHappy() {
        return happy;
    }

    public void setHappy(Boolean happy) {
        this.happy = happy;
    }

    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 Cat getCat() {
        return cat;
    }

    public void setCat(Cat cat) {
        this.cat = cat;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", happy=" + happy +
                ", birth=" + birth +
                ", maps=" + maps +
                ", lists=" + lists +
                ", cat=" + cat +
                '}';
    }
}

application.yaml

person:
  name: ariverh
  age: 22
  happy: true
  birth: 2020/12/3
  maps: {k1: v1,k2: v2}
  lists:
    - a
    - b
    - c
  cat:
    name: cat
    age: 3

测试类:

@SpringBootTest
class MyfirstspringBootApplicationTests {
   @Autowired
   private Person p;
   @Test
   void contextLoads() {
      System.out.println(p);
   }

}

结果:
在这里插入图片描述

结论

@ConfigurationProperties作用:将配置文件中配置的每一个属性的值,映射到这个组件中;告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应。

@configurationProperties可以将实体类与配置文件application.yaml中的下的某个key绑定,那么我们把实体类换成配置类。那么我们就可以通过配置文件给配置类中的某个属性进行赋值。

  • springboot的本质是通过启动器,将对应的依赖导入。再读取自动配置包下的所有自动配置类,自动配置类可以自动将配置类导入spring容器中,配置信息类可以给配置类赋予默认值。但是这些配置类不一定生效,自由再对应依赖存在的情况下才会生效(即在pom文件中导入启动器)。这些配置类中属性都有默认值,配置信息类赋予的。但是我们该怎么修改这些默认值呢?那么我们就通过@configurationProperties把配置类或者配置信息类与配置文件绑定起来。通过配置文件修改配置类中的属性。

    • **配置文件:**application.yaml

    • **自动配置包:**该包下有所有的自动配置类
      在这里插入图片描述

    • **自动配置类:**能够进行自动配置,加载配置类和配置信息类,通过配置信息类给配置类中的属性赋予默认值。
      在这里插入图片描述

    • **配置类:**配置类,能偶配置一些东西。@EnableConfigurationProperties加载对应的配置信息类

      比如:以SpringMVC配置为例。配置前端控制器,配置处理器映射器,配置处理器适配器,配置视图解析器,配置拦截器等配置。这些配置都需要默认的值,这些默认的值就是从配置信息类中获得。
      在这里插入图片描述

    • **配置信息类:**该类存储类很多配置类的一些默认值。通过@ConfigurationProperties与配置文件中的某个key绑定。
      在这里插入图片描述

类与配置文件绑定通过@ConfigurationProperties

类通过获取指定的文件中的信息赋值,可以通过@PropertySource加载指定文件,并通过@Value("${x}")获取指定文件中的信息进行赋值

@ConfigurationProperties与@Value区别

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

1、@ConfigurationProperties只需要写一次即可 , @Value则需要每个字段都添加

2、松散绑定:这个什么意思呢? 比如我的yml中写的last-name,这个和lastName是一样的, - 后面跟着的字母默认是大写的。这就是松散绑定。可以测试一下

3、JSR303数据校验 , 这个就是我们可以在字段是增加一层过滤器验证 , 可以保证数据的合法性

4、复杂类型封装,yml中可以封装对象 , 使用value就不支持

结论:

配置yml和配置properties都可以获取到值 , 强烈推荐 yml;

如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @value;

如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,就直接@configurationProperties,不要犹豫!

4.2jrR303校验与多环境配置

4.2.1校验注解

@Validated//在类上注解即该类开启数据校验

//通过在标有@Validated的类中属性上添加指定的校验注解,就会进行校验
//常见的校验注解

@NotNull(message="名字不能为空")
private String userName;
@Max(value=120,message="年龄最大不能查过120")
private int age;
@Email(message="邮箱格式错误")
private String email;

//空检查
@Null      // 验证对象是否为null
@NotNull    //验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank   //检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty   //检查约束元素是否为NULL或者是EMPTY.
    
//Booelan检查
@AssertTrue     //验证 Boolean 对象是否为 true  
@AssertFalse    //验证 Boolean 对象是否为 false  
    
//长度检查
@Size(min=, max=) //验证对象(Array,Collection,Map,String)长度是否在给定的范围之内  
@Length(min=, max=) //string is between min and max included.

//日期检查
@Past       //验证 Date 和 Calendar 对象是否在当前时间之前  
@Future    // 验证 Date 和 Calendar 对象是否在当前时间之后  
@Pattern    //验证 String 对象是否符合正则表达式的规则

//.......等等
//除此以外,我们还可以自定义一些数据校验规则

4.2.2多环境位置和配置文件位置

多配置文件环境配置:

profile是Spring对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境;

多配置文件:

我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml , 用来指定多个环境版本;

例如:

application-test.properties 代表测试环境配置

application-dev.properties 代表开发环境配置

但是Springboot并不会直接启动这些配置文件,它默认使用application.properties主配置文件

我们需要通过一个配置来选择需要激活的环境:

#比如在配置文件中指定使用dev环境,我们可以通过设置不同的端口号进行测试;#我们启动SpringBoot,就可以看到已经切换到dev下的配置了;
spring.profiles.active=dev

位置文件的种类:

优先级高:application.yaml
优先级低:application.properties  

配置文件课存放的位置:

优先级1:file:./config/application
优先级2:file:./application
优先级3:classpath:/config/application
优先级4:classpath:/application

yaml多模块

和properties配置文件中一样,但是使用yml去实现不需要创建多个配置文件,更加方便了 !

server:  
	port: 8081
#选择要激活那个环境块
spring:  
	profiles:    
		active: prod
---
server:  
	port: 8083
spring:  
	profiles: dev #配置环境的名称

---
server:  
port: 8084
spring:  
	profiles: prod  #配置环境的名称

注意:如果yaml和properties同时都配置了端口,并且没有激活其他环境 , 默认会使用properties配置文件的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值