开发过程中,引入自定义配置是很常见的,主要记录两种:
1、@Value() 注解
2、@ConfigurationPropertie()注解
springboot支持两种配置文件:*.properties 和 *.yml
首先先提一下,在springboot 1.5版本以后是通过@PropertySource(“path”)无法加载YAML文件,官方也给出说明
24.7.4 YAML Shortcomings
YAML files cannot be loaded by using the @PropertySource annotation. So, in the case that you need to load values that way, you need to use a properties file.
如果想引入yml文件,有两种方式:
① 将自定义配置放在application-*.yml中,
② 通过PropertySourcePlaceholderConfigurer来加载yml文件
上代码
// 加载YML格式自定义配置文件
@Bean
public static PropertySourcesPlaceholderConfigurer properties() {
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
yaml.setResources(new FileSystemResource("config.yml"));//File引入
// yaml.setResources(new ClassPathResource("youryml.yml"));//class引入
configurer.setProperties(yaml.getObject());
return configurer;
}
本篇以*.properties为例
引入配置文件
/**
* 程序入口
* @author guocheng.L
*/
@SpringBootApplication
// 加载配置文件
@PropertySource("classpath:config2.properties")
public class MyspringbootApplication {
public static void main(String[] args) {
SpringApplication.run(MyspringbootApplication.class, args);
}
}
config2.properties
user.name=tom
user.age=18
user.tel=13111111111
#集合表示 list
user.books=spring,java,C
#表示Map
user.map={name: 'lili', age: '19'}
Entity.java
/**
*
* @author gcheng.Ll
* @create 2019-08-21 14:37
*/
@Component
public class SysUserConfig2 {
@Value("${user.name}")
private String name;
@Value("${user.age}")
private int age;
@Value("${user.tel}")
private String tel;
/**
* list 自定义配置
*/
@Value("#{'${user.books}'.split(',')}")
private List<String> books;
/**
* map 自定义配置
*/
@Value("#{${user.map}}")
private Map<String, String> wife;
// 省略get,set,toString()方法
}
接口测试类
/**
* @author gcheng.L
* @create 2019-08-21 14:36
*/
@Controller
public class UserConfigController {
@Autowired
private SysUserConfig2 user2;
@ResponseBody
@RequestMapping("/configTest")
public String test() {
System.out.println(user2.toString());
return "SUCCESS";
}
}
结果:
SysUserConfig2{username='tom', age=18, tel='13111111111', books=[spring, java, C], wife={name=lili, age=19}}
代码解释:
利用@Value("${user.username}")注解来获取变量值,但要注意的是如果配置文件中没有设置相应的值,会报错,我们可以通过 @Value(参数名:默认值)的方式给相应的配置加上默认值,例如
@Value("${user.age:10}")
利用@Value("#{’${user.books}’.split(’,’)}") 获取list值
利用@Value("#{${user.map}}") 获取map值,这里需要注意的是, 配置文件中map的写法,值一定要用单引号。
引入配置文件
/**
* 程序入口
*
* @author guocheng.L
*/
@SpringBootApplication
@PropertySource("classpath:config.properties")
public class MyspringbootApplication {
public static void main(String[] args) {
SpringApplication.run(MyspringbootApplication.class, args);
}
}
config.properties
user.username=tom
user.age=18
user.tel=13111111111
#集合表示 list
user.books[0]=spring
user.books[1]=java
#表示Map
user.wife[name]=lili
user.wife[age]=19
Entity.java
@Component
@ConfigurationProperties(prefix = "user")
public class SysUserConfig {
private String username;
private int age;
private String tel;
/**
* list 自定义配置
*/
private List<String> books;
/**
* map 自定义配置
*/
private Map<String, Object> wife;
// 省略get,set,toString()方法
}
接口测试类
/**
* @author gcheng.L
* @create 2019-08-21 14:36
*/
@Controller
public class UserConfigController {
@Autowired
private SysUserConfig user;
@ResponseBody
@RequestMapping("/configTest")
public String test() {
System.out.println(user.toString());
return "SUCCESS";
}
}
结果:
SysUserConfig{username='tom', age=18, tel='13111111111', books=[spring, java], wife={name=lili, age=19}}
代码解读:
在配置文件或者@Value()引入的时候可以添加springboot提供的随机数,当然springboot也提供了其他的常用参数,例如: os (用于获取系统信息), idea (用于获取开发工具信息), pom (用于获取 maven 配置信息), file 文件的相关处理等等。
配置如下
# 随机字符串
rd.value=${random.value}
# 随机int
rd.number=${random.int}
# 随机long
rd.bignumber=${random.long}
# 10以内随机数
rd.number1=${random.int(10)}
# 10 ~ 20 之间随机数
rd.number2=${random.int[10,20]}
Entiry.java
/**
* @author gcheng.L
* @create 2019-08-21 18:05
*/
@Component
@ConfigurationProperties(prefix = "rd")
public class SysRandom {
// 随机字符串
private String value;
// 随机int
private int number;
// 随机long
private long bignumber;
// 10以内随机数
private int number1;
// 10 ~ 20 之间随机数
private int number2;
}
结果:
SysRandom{value='870ae1b7873b6bfa2804efcc0ad7bfdd', number=1162495061, bignumber=-4241195572881172742, number1=4, number2=11}
这就是随机数的引用了, 也可以参数间的引用,像下面这种方式进行引用,通过 ${参数名} 的方式引用了上面提到的值,这里就不做测试了。
rd.age:${user.age}