SpringBoot 配置文件

    科技2022-07-13  122

    SpringBoot 配置文件

    yaml(YAML Ain’t Markup Language)

    语言文件, 已数据为中心, 比json, xml等 更适合做配置文件

    yaml语法

    配置端口号为80;

    server: port: 80 # 项目访问路径 context-path:/

    1. 基本语法

    属性和值区分大小写

    key: value : 表示一对键值对(空格必须有);

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

    server: prot:80 path: /hello

    2. 值的写法

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

    k: v

    字符串默认不加单引号或双引号

    "":双引号; 不会转义字符串中的特殊字符, 特殊字符会作为本身想表示的意思

    name: "zhangshan\nlisi" --- 张三 换行 李四

    '': 单引号; 会转义特殊字符, 特殊字符最终只是一个普通字符串数据

    name: 'zhangshan\nlisi' --- 张三\n李四

    对象 / Map (属性和值)(键值对):

    k: v

    对象 / Map

    # 普通写法 people: name: zhangsan age: 20 # 行内写法 user: {username: zhangsan, age: 20}

    数组(List / Set):

    用- 值表示数组中的一个元素

    # 普通写法 pets: - cat - dog - pig # 行内写法 pets: [cat,dog,pig]

    3. 配置文件的占位符

    随机数

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

    占位符

    获取之前配置的值, 如果没有可以使用:指定默认值

    person.dog.age=${person.ages:10}

    配置文件值注入

    yaml配置文件编写

    person: name: harlan age: 24 sex: true birth: 1997/11/17 map: {k1: v1, k2: v2, k3: v3} list: - first - secound - three - four - five dog: name: doudou age: 2

    domain编写:

    @Component @ConfigurationProperties(prefix = "person") public class Person { private String name; private Integer age; private Boolean sex; private Date birth; private Map<String, Object> map; private List<Object> list; private Dog dog; 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 getSex() { return sex; } public void setSex(Boolean sex) { this.sex = sex; } public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } public Map<String, Object> getMap() { return map; } public void setMap(Map<String, Object> map) { this.map = map; } public List<Object> getList() { return list; } public void setList(List<Object> list) { this.list = list; } public Dog getDog() { return dog; } public void setDog(Dog dog) { this.dog = dog; } }

    需要在domain中添加@ConfugurationProperties注解, 并指定前缀, 然后使用@Component注解添加到Spring容器中

    注意:同时我们可以在pom中导入配置文件处理器, 使得编写yaml配置时有提示信息

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

    使用application.proties配置

    person.name=harlan person.age=23 person.birth=1997/11/17 person.list=a,b,c person.map.k1=v1 p erson.map.k2=v2 person.sex=true

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

    如果说, 欧美只是在某个业务逻辑中需要获取一下配置文件中的某项值, 使用@Value注解

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

    @Validated数据校验

    需要导入数据校验场景依赖

    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>

    在需要校验的属性上添加校验注解

    @Component @Validated @ConfigurationProperties(prefix = "person") public class Person { @Email private String email; ... }

    @PropertySource注解

    用于加载指定的配置文件

    @Component @ConfigurationProperties(prefix = "person") @PropertySource(value = {"classpath:person.properties"}) public class Person { ... }

    @ImportResource注解

    用于导入Spring的配置文件, 让配置文件中的内容生效

    作用于主配置类上, 导入需要的spring配置文件

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

    @Configuration配置类

    在类中加上@Configuration注解, 指定当前类是一个配置类, 其作用相当于Spring的配置文件

    /** * @Configuration:指明当前类是一个配置类, 就是来替代之前的Spring配置文件 * 在配置文件中使用<bean>标签添加组件 * @Author Harlan * @Date 2020/10/3 */ @Configuration public class MyAppConfig { /** * 将方法的返回值添加到容器中 * @return helloService */ @Bean public HelloService helloService(){ return new HelloService(); } }

    @Bean注解

    其作用在方法上, 用于将方法的返回值注入到IoC容器中, 相当于Spring配置文件中的<bean>标签

    /** * 将方法的返回值添加到容器中 * @return helloService */ @Bean public HelloService helloService(){ return new HelloService(); }

    Profile

    1. 多Profile文件

    我们在著配置文件编写的时候, 文件名可以是 application-{profile}.properties/.yml

    默认使用application.properties/.yml配置文件


    2. yml文档块

    使用---来分割不同的配置信息

    profiles: 指定模式名称

    active: 指定激活

    spring: profiles: active: prod server: port: 8080 --- spring: profiles: dev server: port: 8081 --- spring: profiles: prod server: port: 80

    3. 激活指定profile

    在配置文件中指定spring.profiles.active=dev

    spring: profiles: active: dev

    命令行方式激活

    --spring.profile.active=dev

    将项目打成jar包, 使用cmd命令指定参数

    -Dspring.profiles.active=dev



    配置文件加载位置

    spring boot启动会扫描以下位置的application配置文件作为Spring Boot的默认配置文件.

    file:./config/ > file:./ > classpath:./config/ > classpath:./

    以上按照优先顺序从高到低加载, 所有位置的文件都会被加载, 高优先级配置内容会覆盖低优先级配置内容, 其他配置内容互补.

    同时我们也可以通过配置spring.config.location来改变默认配置


    外部配置加载顺序

    SpringBoot也可以从以下位置加载配置, 按照优先级从高到低; 高优先级的配置覆盖低优先级配置, 其余互补

    命令行参数

    java -jar spring-boot-xxx-xxx-xxx-SNAPSHOT.jar --server.prot=80 --server.context-path=/hello

    来自java:comp/env的JNDI属性

    Java系统属性(System.getProperties)

    操作系统环境变量

    RandomValuePropertySource配置random.*属性值


    优先加载带profile的配置文件, 由jar包外向jar包内寻找

    jar包外部的application-{profile}.properties/yml(带Spring.profile)配置文件

    jar包内部的application-{profile}.properties/yml(带Spring.profile)配置文件

    jar包外部的application.properties/yml(不带Spring.profile)配置文件

    jar包内部的application.properties/yml(不带Spring.profile)配置文件

    @Configuration注解类上的@PropertySource

    通过SpringApplication.setDefaultProperties指定的默认属性

    所有支持的配置参考SpringBoot参考官方文档: https://spring.io/guides#getting-started-guides



    自动配置原理

    未学习明白!

    Processed: 0.009, SQL: 8