本章概要
- Properties 配置
- 类型安全配置属性
- YAML配置
- Profile
2.5 Properties配置
Spring Boot中采用了大量的自动化配置,但是对于开发者而言,在实际项目中不可避免会有一些需要自己手动配置,承载这些自定义配置的文件就是resources目录下的application.properties文件(也可可以使用YAML配置来代替application.properties)。Spring Boot 项目中的application.properties 配置文件一共可以出现在如下4个位置:
- 项目根目录下的config文件夹中
- 项目根目录下
- classpath 下的config文件夹中
- classpath 下
如果4个位置都有application.properties文件,那么加载的优先级从1到4一次降低。application.yml作为配置文件也是按照以上顺序加载到Spring Environment中。指定配置文件app.properties启动jar包命令:
java -jar **.jar --spring.config.name=app
2.6 类型安全配置属性
Spring 提供了@Value注解以及EnvironmentAware接口来将Spring Environment中的数据注入到属性上,Spring Boot对此进一步提出了类型安全配置属性(Type-safe Configuration Properties),这样即使在数据量非常庞大的情况下,也可以更加方便地将配置文件中的数据注入Bean中。考虑在application.properties中添加如下配置:
book.name=斗罗大陆
book.author=唐家三少
book.price=60
将这一段配置数据注入如下Bean中:
如出现Spring Boot Configuration Annotation Processor not found in claspath,则在pom中导入如下依赖
<!-- 导入配置文件处理器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
@Component
@PropertySource(value = "classpath:book.properties")
@ConfigurationProperties("book")
public class Book {
private String name;
private String author;
private Float price;
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public Float getPrice() {
return price;
}
public void setPrice(Float price) {
this.price = price;
}
}
代码解释:
- @ConfigurationProperties中的prefix属性描述了要加载的配置文件的前缀
- 如果配置文件是一个YAML文件,那么可以将数据注入一个集合中。
- Spring Boot采用了一种宽松的规则来进行属性绑定,如果Bean中的属性名为authorName,那么配置文件中的属性可以使 book.author_name、book.author-name、book.authorName或者book.AUTHORNAME(注意乱码问题)
创建BookController进行测试
@RestController
public class BookController {
@Autowired
Book book;
@GetMapping("/book")
public String book(){
return book.toString();
}
}
注入Book,并将实例数据,如图
果然还是出现乱码了,在Book类中修改@PropertySource注解属性
@PropertySource(value = "classpath:book.properties" , encoding = "UTF-8")
2.7 YAML配置
2.7.1 常规配置
YAML是JSON的超集,简洁而强大,是一种专门用来书写配置文件的语言,可以替代application.properties。在创建一个Spring Boot项目时,引入的spring-boot-starter-web依赖间接的引入了snakeyaml依赖,snakeyaml会实现对YAML 配置的解析。YAML 利用缩进来表示层级关系,并且大小写敏感。在Spring Boot 项目中使用YAML 只需要在resources目录下创建一个application.yml文件即可,然后添加如下配置:
server:
port: 8081
servlet:
context-path: /chapter02
tomcat:
uri-encoding: utf-8
等效于application.properties
server.port=8081
server.servlet.context-path=/chapter01
server.tomcat.uri-encoding=utf-8
此时可以将resources目录下的application.properties文件删除,完全使用YAML完成文件的配置。(我尝试不删除这个文件,一个端口设置8081,一个设置8082,结果加载了application.properties,删除application.properties后才加载YAML的配置)
2.7.2 复杂配置
YAML不仅可以配置常规属性,也可以配置复杂属性,如下:
my:
users:
- name: 江南一点雨
address: China
favorites:
- 足球
- 徒步
- Coding
- name: sang
address: GZ
favorites:
- 阅读
- 吉他
这组配置在集合中放的是一个对象,先创建对应实体
public class User {
private String name;
private String address;
private List<String> favorites;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public List<String> getFavorites() {
return favorites;
}
public void setFavorites(List<String> favorites) {
this.favorites = favorites;
}
}public class User {
private String name;
private String address;
private List<String> favorites;
}
然后注入
@Component
@ConfigurationProperties(prefix = "my")
public class Users {
private List<User> users;
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
在Spring Boot中使用YAML虽然方便,但是YAML也有一些缺陷,例如无法使用@PropertySource注解加载YAML文件,如果项目中有这种需求,还是需要使用Properties格式的配置文件。
2.8 Profile
开发者在项目发布之前,一般需要频繁地在开发环境、测试环境以及生产环境之间进行切换,这个时候大量的配置需要频繁更改,例如数据库配置、redis配置、mongodb配置、jms配置等。频繁修改带来了巨大的工作量,Spring 对此提供了解决方案(@Profile注解),Spring Boot 则更进一步提供了更加简洁的解决方案,Spring Boot 中约定的不同环境下配置文件名称规则为application-{profile}.properties,profile占位符标识当前环境的名称,具体配置步骤如下:
1.创建配置文件
首先在resources目录下创建两个配置文件:application-dev.properties 和 application-prod.properties,分别表示开发环境中的配置和生产环境中的配置。其中application-dve.properties文件的内容如下:
server.port=8081
application-prod.properties如下
server.port=8082
2. 配置application.properties
spring.profiles.active=dev
通过改变spring.profiles.active的值来切换配置文件
3. 在代码中配置
修改启动类的main方法,如下
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplicationBuilder builder = new SpringApplicationBuilder(App.class);
builder.application().setAdditionalProfiles("dev");
builder.run(args);
}
}
通过setAdditionalProfiles()方法来切换配置文件
4. 项目启动配置
示例命令
java -jar **.jar --spring.profiles.active=dev