文章目录
1. 配置文件
全局配置文件:application.properties 或 application.yml (/.yaml)
- 文件名固定
- 作用:修改Spring Boot 默认配置
- 以数据为中心,比json、xml更适合做配置文件
2. YAML语法
2.1 基本语法
-
kye: value # 空格必须有
-
空格代表层级关系,多少无所谓,同一层左对齐就好
server: port: 8081 path: /hello
2.2 值的写法
-
字面量:普通的值诸如数字字符等
key: value # 不用加引号,引号特殊含义如下 # "zhang \n rr" 不会转义特殊字符,输出zhang换行rr # 'zhang \n rr' 会转义,输出zhang \n rr
-
对象、map(键值对)
key: value # 在下一行写属性和值的关系,例如 friends: name: test age: 20 # 行内写法 friends: {name: test, age: 20}
-
数组(List, Set)
用
pets: - cat - dog - pig # 行内写法 pets: [cat, dog, pig]
2.3 例子
Person.java
/**
* 将配置文件中的值映射到这个组件中
* @ConfigurationProperties //告诉SpringBoot将本类中所有的属性和配置文件中的相关属性进行绑定
* prefix= "person" 配置文件中那个值进行映射
*
* 只有这个组件是容器中的组件(@Component),才能用容器提供的@ConfigurationProperties功能
*/
@Component
@ConfigurationProperties(prefix = "person")
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;
......
application.yml
person:
lastName: Zhang
age: 20
boss: false
birth: 1999/07/16
maps: {k1: v1, k2: v2}
lists:
- lisi
- zao
- wang
dog:
name: wang
age: 20
test
/**
* SpringBoot 单元测试
*
* 可以在测试期间很方便的类似编码一样进行自动注入等容器
*/
@SpringBootTest
class SpringBoot02ConfigApplicationTests {
@Autowired
Person person;
@Test
void contextLoads() {
System.out.println(person);
}
}
-
详细代码见 spring-boot-02-config
-
可能遇到的问题一
<!-- 导入配置文件处理器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
-
可能遇到的问题二
测试依赖
<dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-launcher</artifactId> <version>1.5.2</version> <scope>test</scope> </dependency>
3. properties语法
server.port=8081
person.name=zhang
4. @Value vs @ConfigurationProperties
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法,last-name等同lastName) | 支持 | 不支持 |
SpEL(Spring语法,计算式之类的) | 不支持 | 支持 |
JSR303校验(@Validated校验注入格式,例如邮箱格式@Email) | 支持 | 不支持 |
复杂类型封装(map之类) | 支持 | 不支持 |
-
如果只是过去某个值,就用@Value, 例如
@RestController public class HelloController { @Value("${person.last-name}") private String name; @RequestMapping("/sayhello") public String sayHello(){ return "Hello " + name + "!"; } }
-
如果专门写了个javaBean来与配置文件映射,则用@ConfigurationProperties
5. @PropertySource & @ImportResource
- @PropertySource: 加载指定的配置文件
@PropertySource(value = {"classpath:person.properties"}) //指定加载配置文件, 不加这个注解相当于默认全局配置
@Component //把Perason加到容器中
@ConfigurationProperties(prefix = "person")
public class Person {
//@Value("${person.last-name}") //直接赋值
-
@ImportResource: 导入Spring的配置文件,让配置文件中的内容生效
Spring Boot 里面没有Spring的配置文件,我们自己编写的配置文件内也不能自动识别
想让Spring的配置文件生效,;@ImportResource(添加到配置类上)
-
然而,SpringBoot推荐给容器中添加组件的方式:推荐使用全注解的方式
-
配置类==========Spring配置文件(.xml)
-
使用@Bean添加组件
/** * 指明当前类是一个配置类,就是来替代之前的Spring配置文件 * * 在配置文件中用<bean></bean>添加组件 * * 在SP中,@Bean */ @Configuration public class MyAppConfig { //将方法的返回值添加到容器中,容器中这个组件默认的id为方法名 @Bean public HelloService helloService(){ System.out.println("配置类@Bean给容器中添加组件了......"); return new HelloService(); } }
-
6. 配置文件占位符
-
随机数
person.age=${random.int}
-
占位符获取之前配置的值,如果没有可以使用冒号指定默认值
person.dog.name=${person.last-name}_wang
7. Profile
-
多Profile文件
在主配置文件编写的时候,文件名可以是
application-profileName.properties/yml
就可以动态切换
默认application.properties
-
yml支持多文档方式
server: port: 8081 spring: profiles: actice: dev --- server: port: 8082 spring: profiles: dev --- server: port: 8083 spring: profiles: test
- 常见三种环境
appication-dev.properties/yml 开发环境
appication-test.properties/yml 测试环境
appication-prod.properties/yml 生产环境
-
激活指定profile
a. 配置文件中指定
spring.profiles.active=dev
b. 命令行(打包后)
java -jar fileName.jar --spring.profiles.active=dev
8. 配置文件加载优先级
-
由高到低,全部加载,高的为主
-file: ./config/ (file根目录)
-file: ./
-classpath: /config/
-classpath:.
-
关于classpath
开发时期的项目里,
src/main/
下面的java
和resources
文件夹都被(编译)打包到了生产包的WEB-INF/classes/
目录下