SpringBoot从配置文件中获取属性的四种方法总结
目录
- 方式一:@Value
- 方式二:@ConfigurationProperties
- @Value和@ConfigurationProperties比较
- 方式三:@PropertySource
- 方式四:使用工具类无需注入获取.yml中的值
方式一: @Value
基本类型属性注入,直接在字段上添加@Value("${xxx.xxx}")即可.注意这里用的是$,而不是#.@Value注入的属性,一般其他属性没有关联关系.
配置文件
user: name: Manaphy age: 19 sex: male
方式二: @ConfigurationProperties
配置文件
@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
/** * 将配置文件中配置的每一个属性的值,映射到这个组件中 * @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层
@RestController public class PersonController { @Autowired private Person person; @GetMapping("/person") public Person getPerson() { return person; } }
运行结果如下
我们可以导入配置文件处理器,以后编写配置就有提示了
<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
配置文件
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
@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 类,用于项目启动构造我们的工具类
@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()); } }
工具类实现
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)); } }
调用示例
@RestController public class PersonController { @GetMapping("/msg") public String getMessage() { return YamlConfigurerUtil.getStrYmlVal("person.lastName"); } }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。
赞 (0)