全局配置文件能够对一些默认配置值进行修改。SpringBoot使用一个application.properties或者application.yaml/yml的文件作为全局配置文件,一般该文件存放在 src\main\resources
目录下,接下来将针对这两种全局配置文件进行讲解。
这三种文件的加载顺序在 spring-boot-starter-parent
的pom文件配置了,顺序如下
<includes>
<include>**/application*.ymlinclude>
<include>**/application*.yamlinclude>
<include>**/application*.propertiesinclude>
includes>
使用Spring Initialize方式构建SpringBoot项目时,会在resource目录下自动生成一个空的applicatio.properties文件,SpringBoot启动时会自动加载application.properties文件。
我们可以在application.properties文件中定义SpringBoot项目的相关属性,当然,这些属性可以是系统属性、环境变量、命令参数等信息,也可以是自定义的配置。
server.port=8081
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.config.additional-location=
spring.config.location=
spring.config.name=application
那我们如何在Java类中使用这些配置呢?
新建Person类,该类需要注入配置文件的属性
@Component // 将Person注入到SpringBean容器中
@ConfigurationProperties(prefix= "person") // 将配置文件以person开头的属性注入到改类中
public class Person {
private int id;
private String name;
private List hobby;
private String[] family;
private Map map;
private Pet pet;
// 省略get/set方法
}
@ConfigurationProperties(prefix = “person”) 注解的作用是将配置文件中以person开头的属性通过setXXX()方法注入到实体类对应的属性中
@Component 注解的作用是将当前注入属性值的Person类对象作为Bean放到Spring IOC容器中,才能被@ConfigurationProperties 注解赋值
Person的依赖Pet类
public class Pet {
private String type;
private String name;
// 省略get/set方法
}
我们在application.properties文件中配置如下:
person.id=1
person.name=cham
person.hobby=coding,game,sleep
person.map.k1=v1
person.map.k2=v2
person.pet.type=cat
person.pet.name=diudiu
编写application.properties配置文件时,由于要配置的Person对象属性是我们自定义的,SpringBoot无法自动识别,所以不会有任何代码提示。在实际开发中,为了出现代码提示来方便配置,在使用 @ConfigurationProperties 注解进行配置文件属性值注入时,可以在pom.xml文件引入SpringBoot提供的配置处理器依赖:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
<optional>trueoptional>
dependency>
单元测试依赖:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
测试输出:
@RunWith(SpringRunner.class) // 测试启动器,并加载SpringBoot测试注解
@SpringBootTest // 标记为SpringBoot单元测试类,并加载项目的ApplicationContext上下文环境
class SpringbootDemoApplicationTests {
@Autowired
private Person person;
@Test
public void configurationTest() {
System.out.println(person);
}
}
输出:
Person(id=1, name=cham, hobby=[coding, game, sleep], family=null, map={k1=v1, k2=v2}, pet=Pet(type=cat, name=diudiu))
可以看出,测试方法成功运行,并且正确打印出了我们配置文件的属性,说明我们通过相关注解完成了属性注入
YAML文件格式是SpringBoot支持的一种JSON超集文件格式,相较于传统的Properties配置文件,YAML文件以数据为核心,是一种更为直观且更容易被系统识别的数据序列化格式。application.yaml配置文件的工作原理和application.properties是一样的,只不过yaml格式配置文件看起来更简洁一些。
key:(空格) value
格式配置属性,使用缩进控制层级关系这里针对不同数据类型的属性值,介绍一下YAML
value值为普通数据类型(例如数字、字符串、布尔等)时,可以直接配置对应的属性值,字符串不需要添加引号
server:
port: 8100
tomcat:
uri-encoding: utf-8
spring:
profiles:
active: dev
thymeleaf:
cache: false
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
value值为数组或者单列集合,有三种写法
person:
hobby:
- coding
- game
- sleep
person:
hobby:
coding,
game,
sleep
person:
hobby: [coding,read,sleep]
value为Map集合或对象
person:
map:
k1: v1
k2: v2
person:
map: {k1: v1,k2: v2}
使用SpringBoot 全局配置文件设置属性时:
SpringBoot支持多种注入配置文件属性的方式,下面介绍下如何使用注解 @ConfigurationProperties 和 @Value 注入属性
在上面的示例中已经讲过了,这里再介绍下
SpringBoot提供的**@ConfigurationProperties** 注解用来快速的将配置文件的属性批量注入到Bean对象的多个属性中。
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private int id;
public void setId(int id) {
this.id = id;
}
}
上述代码使用 @Component 和 @ConfigurationProperties 将配置文件的每个属性映射到Person中,且@ConfigurationProperties 注入时依赖Set() 方法。
@Value 是Spring框架提供的,用来读取配置文件中的一个属性值注入到Bean对象的对应属性值上
@Component
public class Person {
@Value("${person.id}")
private int id;
}
@Value 不依赖Set() 方法
比如我们定义了一个自定义配置文件 shiro.properties
# session 超时时间,单位为秒
shiro.session_timeout=86400
# rememberMe cookie有效时长,单位为秒
shiro.cookie_timeout=86400
# 免认证的路径配置,如静态资源等
shiro.anon_url=/test/**,/febs/**,/img/**,/layui/**,/json/**,/images/captcha,/public/test,/refreshCache
# 登录 url
shiro.login_url=/login
# 首页 url
shiro.success_url=/index
# 登出 url
shiro.logout_url=/logout
# 未授权跳转 url
shiro.unauthorized_url=/unauthorized
如何加载这个配置文件呢?
对于自定义配置文件,我们可以使用@PropertySource 注解结合 @Configuration 注解配置类方式来实现配置注入。
@PropertySource 注解用于指定配置文件的具体位置和名称
@Configuration 是为了保证SpringBoot能够扫描到@PropertySource 注解,将该实体类作为自定义配置类
@Configuration
@PropertySource(value = {"classpath:shiro.properties"})
@ConfigurationProperties(prefix = "shiro")
public class ShiroProperties {
private long sessionTimeout;
private int cookieTimeout;
private String anonUrl;
private String loginUrl;
private String successUrl;
private String logoutUrl;
private String unauthorizedUrl;
// 省略set方法
}
app.name=MyApp
app.description=${app.name} is a Spring Boot application