背景
在项目开发过程中,很多东西我们都需要做成可配置化,那么使用spring的时候我们都有哪些使用配置文件的方式呢?接下来我们就来讲一下。
定义配置文件
我们以最长使用的jdbc为例
jdbc.url=jdbc:mysql://localhost/test
jdbc.username=dbuser
jdbc.password=dbpass
jdbc.driver-class-name=com.mysql.jdbc.Driver
不使用spring boot之前我们怎么处理
XML方式配置
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations" value="classpath:jdbc.properties"/>
</bean>
<bean id="dataSource" destroy-method="close"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
Java Bean Configuration
使用Environment
@Component
@PropertySource("classpath:jdbc.properties")
public class ConfigurationWithEnviroment {
@Autowired
private Environment env;
@PostConstruct
public void init() {
System.out.println("jdbc.url: " + env.getProperty("jdbc.url"));
// 控制台输出jdbc.url: jdbc:mysql://localhost/test
}
}
记得在使用Environment引入配置文件配置Mybatis的时候,报出异常,Environment注入为空的异常,原因是BeanFactoryPostProcessor Bean创建得比较早。详细请看: https://stackoverflow.com/questions/19421092/autowired-environment-is-null https://jira.spring.io/browse/SPR-13683
使用EnvironmentAware
@Component
@PropertySource("classpath:jdbc.properties")
public class ConfigurationWithEnviroment implements EnvironmentAware{
private Environment env;
@Override
public void setEnvironment(Environment env) {
this.env = env;
}
@PostConstruct
public void init() {
System.out.println("jdbc.url: " + env.getProperty("jdbc.url"));
//控制台输出jdbc.url: jdbc:mysql://localhost/test
}
}
使用@Value注解
使用@Value注解我们需要配置占位符org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations" value="classpath:com/foo/jdbc.properties"/>
</bean>
或使用Java Bean配置
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
Spring boot中默认会配置该选项,详细代码PropertyPlaceholderAutoConfiguration类
Spring Boot里的标准配置文件application.[properties|yaml]
Spring Boot官方统一配置文件,可以配置所有的Spring Boot中的配置,从datasource到web到安全等等。官方支持properties和yaml两种文件格式。
配置文件里的替换符
Spring Boot的配置文件支持上下文依赖替换,怎么说呢,就是我们可以使用前面定义的属性来达到公用的目的。 例如:
server:
port: ${random.int[8080,8088]}
name: ${random.name}
placeholder: ${server.name} //使用前面定义的server.name
配置文件里的随机数
server:
port: ${random.int[8080,8088]} //8080到8088之间的随机数
name: ${random.name} //随机字符串
lessTen: ${random.int(10)}// 小于10
uuid: ${random.uuid} // uuid
@Autowired
private Environment env;
@PostConstruct
public void init() {
System.out.println(env.getProperty("server.port"));
System.out.println(env.getProperty("server.name"));
System.out.println(env.getProperty("server.lessTen"));
System.out.println(env.getProperty("server.uuid"));
}
输出
8085
adb4648465e5675aa27ba28d47f88015
7
f5286b15-b37c-4e0a-aa42-baef2c663e20
Spring Boot里的注解@ConfigurationProperties
my:
list:
- name: java
- name: php
- name: go
@ConfigurationProperties("my")
@Component
public class Configuration {
private final List<String> list = new ArrayList<String>(); //对应配置文件里的my list name.
public List<String> getList() {
return list;
}
}