前言
分散配置是系统必不可少的一部分,将配置参数抽离出来为后期维护提供很大的便利。spring boot 默认支持两个格式的配置文件:.properties .yml。
.properties与.yml
*.properties属性文件;属于最常见的一种;
*.yml是yaml格式的文件,yaml是一种非常简洁的标记语言。
在*.properties中定义user.address.stree=hangzhou等价与yaml文件中的
user:
address:
stree:hangzhou
从上可以发现yaml层次感更强,具体在项目中选择那种资源文件是没有什么规定的。
解析
在spring boot中默认会加载
classpath:/,classpath:/config/,file:./,file:./config/ 路径下以application命名的property或yaml文件;
参数spring.config.location设置配置文件存放位置
参数spring.config.name设置配置文件名称
在启动工程时会为age随机生成一个值
random.int(100):限制生成的数字小于10 r a n d o m . i n t ( 100 ) : 限 制 生 成 的 数 字 小 于 10 {random.int[0,100]} : 指定范围的数字
在配置文件调用占位符
修改配置文件:
userName=liaokailin
age= random.int[0,100]remark=hello,mynameis r a n d o m . i n t [ 0 , 100 ] r e m a r k = h e l l o , m y n a m e i s {userName},age is ${age}
修改bean:
@Component
public class User {
private @Value("${userName:lkl}") String name;
private @Value("${age}") Integer age;
private @Value("${remark}") String remark;
执行发现remark答应出:
remark=hello,my name is liaokailin,age is 25。
可以发现将name修改为userName,在配置文件中调用 name是工程名。去掉@Value大家可以发现前面在bean中调用配置参数使用的为注解@Value,在springboot中是可以省去该注解。配置文件:userName=liaokailinage= n a m e 是 工 程 名 。 去 掉 @ V a l u e 大 家 可 以 发 现 前 面 在 b e a n 中 调 用 配 置 参 数 使 用 的 为 注 解 @ V a l u e , 在 s p r i n g b o o t 中 是 可 以 省 去 该 注 解 。 配 置 文 件 : u s e r N a m e = l i a o k a i l i n a g e = {random.int[0,100]}
remark=hello,my name is userName,ageis u s e r N a m e , a g e i s {age}
user.address=china,hangzhou
增加user.address=china,hangzhou,为了调用该参数来使用@ConfigurationProperties。
User.java
@Component
@ConfigurationProperties(prefix = “user”)
public class User {
private @Value("${userName:lkl}") String name;
private @Value("${age}") Integer age;
private @Value("${remark}") String remark;
private String address;
使用@ConfigurationProperties需要指定prefix,同时bean中的属性和配置参数名保持一致。
实体嵌套配置
在User中定义一个Address实体同样可以快捷配置
User.java
@Component
@ConfigurationProperties(prefix = “user”)
public class User {
private @Value("${userName:lkl}") String name;
private @Value("${age}") Integer age;
private @Value("${remark}") String remark;
private String address;
private Address detailAddress;
Address.java
“`
public class Address {
private String country;
private String province;
private String city;
…
}
application.properties`
userName=liaokailin
age= random.int[0,100]remark=hello,mynameis r a n d o m . i n t [ 0 , 100 ] r e m a r k = h e l l o , m y n a m e i s {userName},age is ${age}
user.address=china,hangzhou
user.detailAddress.country=china
user.detailAddress.province=zhejiang
user.detailAddress.city=hangzhou
运行得到
userUser [name=liaokailin, age=57, remark=hello,my name is liaokailin,age is 0, address=china,hangzhou, detailAddress=Address [country=china, province=zhejiang, city=hangzhou]]
1
这种嵌套关系如果通过yaml文件展示出来层次感会更强。
user:
detailAddress:
country:china
province:zhejiang
city:hangzhou
注意在yaml中缩进不要使用TAB
配置集合
一个人可能有多个联系地址,那么地址为集合
User.java
@Component
@ConfigurationProperties(prefix = “user”)
public class User {
private @Value("${userName:lkl}") String name;
private @Value("${age}") Integer age;
private @Value("${remark}") String remark;
private String address;
private Address detailAddress;
private List allAddress = new ArrayList();
application.properties
user.allAddress[0].country=china
user.allAddress[0].province=zhejiang
user.allAddress[0].city=hangzhou
user.allAddress[1].country=china
user.allAddress[1].province=anhui
user.allAddress[1].city=anqing
``
下标`表明对应记录为集合中第几条数据,得到结果:
通过
1userUser [name=liaokailin, age=64, remark=hello,my name is liaokailin,age is 82, address=china,hangzhou, detailAddress=Address [country=china, province=zhejiang, city=hangzhou], allAddress=[Address [country=china, province=zhejiang, city=hangzhou], Address [country=china, province=anhui, city=anqing]]]
1
如果用yaml文件表示为:
application.yml
user:
-allAddress:
country:china
province:zhejiang
city:hangzhou
-allAddress:
country:china
province:anhui
city:anqing
多配置文件
spring boot设置多配置文件很简单,可以在bean上使用注解@Profile(“development”)即调用application-development.properties|yml文件,也可以调用SpringApplication中的etAdditionalProfiles()方法。
例如:
package com.lkl.springboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Profile;
import com.lkl.springboot.listener.MyApplicationStartedEventListener;
@Profile(“development”)
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(Application.class);
// app.setAdditionalProfiles(“development”);
app.addListeners(new MyApplicationStartedEventListener());
app.run(args);
}
}
也可以通过启动时指定参数spring.profiles.active。
自定义Filter
我们常常在项目中会使用filters用于录调用日志、排除有XSS威胁的字符、执行权限验证等等。Spring Boot自动添加了OrderedCharacterEncodingFilter和HiddenHttpMethodFilter,并且我们可以自定义Filter。
两个步骤:
实现Filter接口,实现Filter方法
添加@Configurationz 注解,将自定义Filter加入过滤链
@Configuration
public class WebConfiguration {
@Bean
public RemoteIpFilter remoteIpFilter() {
return new RemoteIpFilter();
}
@Bean
public FilterRegistrationBean testFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new MyFilter());
registration.addUrlPatterns("/*");
registration.addInitParameter("paramName", "paramValue");
registration.setName("MyFilter");
registration.setOrder(1);
return registration;
}
public class MyFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain filterChain)
throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request = (HttpServletRequest) srequest;
System.out.println("this is MyFilter,url :"+request.getRequestURI());
filterChain.doFilter(srequest, sresponse);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
}
更多参考:http://www.cnblogs.com/ityouknow/p/5730412.html