SpringBoot從配置文件中獲取屬性的四種方法總結
方式一: @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"); } }
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- SpringBoot 配置文件給實體註入值方式
- SpringBoot @PropertySource與@ImportResource有什麼區別
- @PropertySource 無法讀取配置文件的屬性值解決方案
- 解決SpringBoot使用yaml作為配置文件遇到的坑
- SpringBoot配置加載,各配置文件優先級對比方式