方式一: @Value
基本类型属性注入,直接在字段上添加@Value("${xxx.xxx}")即可.注意这里用的是$,而不是#.@Value注入的属性,一般其他属性没有关联关系.
配置文件
1
2
3
4
|
user: name: Manaphy age: 19 sex: male |
方式二: @ConfigurationProperties
配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
|
@RestController public class ConfigPropertiesController { @Value ( "${user.name}" ) private String name; @Value ( "${user.age}" ) private Integer age; @Value ( "${user.sex}" ) private String sex; @GetMapping ( "/user" ) public String getUser() { return "{name:" + name + ",age:" + age + ",sex:" + sex + "}" ; } } |
JavaBean
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
/** * 将配置文件中配置的每一个属性的值,映射到这个组件中 * @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定; * prefix = "person":配置文件中哪个下面的所有属性进行一一映射 * 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能 */ @Component @ConfigurationProperties (prefix = "person" ) @Data public class Person { private String lastName; private Integer age; private Boolean boss; private Date birth; private Map<String, Object> maps; private List<Object> lists; private Dog dog; } @Data class Dog { private String name; private Integer age; } |
Controller层
1
2
3
4
5
6
7
8
9
|
@RestController public class PersonController { @Autowired private Person person; @GetMapping ( "/person" ) public Person getPerson() { return person; } } |
运行结果如下
我们可以导入配置文件处理器,以后编写配置就有提示了
1
2
3
4
5
|
< dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-configuration-processor</ artifactId > < optional >true</ optional > </ dependency > |
@Value和@ConfigurationProperties比较
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
配置文件yml还是properties他们都能获取到值;
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;
方式三: @PropertySource
配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
|
person.lastName=chen person.age= 22 person.boss= false person.birth= 2017 / 12 / 12 person.map1.k1=v1 person.map1.k2=v2 person.map2[k1]=v1 person.map2[k2]=v2 person.list[ 0 ]=zhang person.list[ 1 ]=wang person.list2=zhao,qian,sun,li person.dog.name=小狗 person.dog.age= 12 |
JavaBean
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
@Component @ConfigurationProperties (prefix = "person" ) //如果只有一个主配置类文件,@PropertySource可以不写 @PropertySource ( "classpath:person.properties" ) @Data public class Person { private String lastName; private Integer age; private Boolean boss; private Date birth; private Map<String, Object> map1; private Map<String, Object> map2; private List<Object> list; private List<Object> list2; private Dog dog; } @Data class Dog { private String name; private Integer age; } |
测试同方式二
方式四: 使用工具类 无需注入获取.yml中的值
新建 BeanConfiguration 类,用于项目启动构造我们的工具类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
@Configuration @Slf4j public class BeanConfiguration { @Bean public YamlConfigurerUtil ymlConfigurerUtil() { //1:加载配置文件 Resource app = new ClassPathResource( "application.yml" ); Resource appDev = new ClassPathResource( "application-dev.yml" ); Resource appProd = new ClassPathResource( "application-prod.yml" ); YamlPropertiesFactoryBean yamlPropertiesFactoryBean = new YamlPropertiesFactoryBean(); // 2:将加载的配置文件交给 YamlPropertiesFactoryBean yamlPropertiesFactoryBean.setResources(app); // 3:将yml转换成 key:val Properties properties = yamlPropertiesFactoryBean.getObject(); String active = null ; if (properties != null ) { active = properties.getProperty( "spring.profiles.active" ); } if (StringUtils.isEmpty(active)) { log.error( "未找到spring.profiles.active配置!" ); } else { //判断当前配置是什么环境 if ( "dev" .equals(active)) { yamlPropertiesFactoryBean.setResources(app, appDev); } else if ( "prod" .equals(active)) { yamlPropertiesFactoryBean.setResources(app, appProd); } } // 4: 将Properties 通过构造方法交给我们写的工具类 return new YamlConfigurerUtil(yamlPropertiesFactoryBean.getObject()); } } |
工具类实现
1
2
3
4
5
6
7
8
9
10
11
12
|
public class YamlConfigurerUtil { private static Properties ymlProperties = new Properties(); public YamlConfigurerUtil(Properties properties) { ymlProperties = properties; } public static String getStrYmlVal(String key) { return ymlProperties.getProperty(key); } public static Integer getIntegerYmlVal(String key) { return Integer.valueOf(ymlProperties.getProperty(key)); } } |
调用示例
1
2
3
4
5
6
7
|
@RestController public class PersonController { @GetMapping ( "/msg" ) public String getMessage() { return YamlConfigurerUtil.getStrYmlVal( "person.lastName" ); } } |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/weixin_45631876/article/details/102644421