詳解Spring獲取配置的三種方式
前言
最近在寫框架時遇到需要根據(jù)特定配置(可能不存在)加載 bean 的需求,所以就學習了下 Spring 中如何獲取配置的幾種方式。
Spring 中獲取配置的三種方式
- 通過 @Value 方式動態(tài)獲取單個配置
- 通過 @ConfigurationProperties + 前綴方式批量獲取配置
- 通過 Environment 動態(tài)獲取單個配置
通過 @Value 動態(tài)獲取單個配置
1.作用
可修飾到任一變量獲取,使用較靈活
2.優(yōu)點
使用簡單,且使用關聯(lián)的鏈路較短
3.缺點
- 配置名不能被有效枚舉到
- 每一個配置的使用都需重新定義,使用較為麻煩
- 項目強依賴配置的定義,配置不存在則會導致項目無法啟動
4.使用場景
- 項目強依賴該配置的加載,想要從源頭避免因配置缺失導致的未知問題
- 只想使用少數(shù)幾個配置
5.代碼示例
@Configuration public class ConfigByValueAnnotation { @Value("${server.port}") private String serverPort; public String getServerPort() { return serverPort; } }
6.測試代碼
@DisplayName("multipart get config") @SpringBootTest public class MultipartGetConfigTest { private static final Logger log = LoggerFactory.getLogger(MultipartGetConfigTest.class); @Autowired private ConfigByValueAnnotation configByValueAnnotation; @Test public void getByValueAnnotation(){ log.info("get by @Value, value: {}", configByValueAnnotation.getServerPort()); } }
7.測試結(jié)果
org.spring.demo.MultipartGetConfigTest : get by @Value, value: 7100
通過@ConfigurationProperties+前綴方式批量獲取
1.作用
用于配置類的修飾或批量配置的獲取
2.優(yōu)點
- 使用配置只需確定 key 的前綴即能使用,有利于批量獲取場景的使用
- 因采用前綴匹配,所以在使用新的相同前綴 key 的配置時無需改動代碼
3.缺點
- 使用復雜,需定義配置類或者手動創(chuàng)建 bean 后引入使用
- 增加新的前綴相同 key 時可能會引入不穩(wěn)定因素
4.使用場景
- 需要同時使用多前綴相同 key 的配置
- 期望增加新配置但不修改代碼的 properties 注入
5.代碼示例
@Component @ConfigurationProperties(prefix = "server", ignoreInvalidFields = true) public class ConfigByConfigurationProperties { private Integer port; public Integer getPort() { return port; } public ConfigByConfigurationProperties setPort(Integer port) { this.port = port; return this; } }
@Configuration public class ConfigByConfigurationPropertiesV2 { @Bean("configByValueAnnotationV2") @ConfigurationProperties(prefix = "server2") public Properties properties(){ return new Properties(); } }
6.測試代碼
@DisplayName("multipart get config") @SpringBootTest public class MultipartGetConfigTest { private static final Logger log = LoggerFactory.getLogger(MultipartGetConfigTest.class); @Autowired private ConfigByConfigurationProperties configByConfigurationProperties; @Autowired @Qualifier("configByValueAnnotationV2") private Properties properties; @Test public void getByConfigurationProperties(){ log.info("get by @ConfigurationProperties, value: {}", configByConfigurationProperties.getPort()); log.info("get by @ConfigurationProperties and manual create bean, value: {}", properties.getProperty("port")); } }
7.測試結(jié)果
org.spring.demo.MultipartGetConfigTest : get by @ConfigurationProperties, value: 7100
org.spring.demo.MultipartGetConfigTest : get by @ConfigurationProperties and manual create bean, value: 7100
通過 Environment 動態(tài)獲取單個配置
1.作用
用于動態(tài)在程序代碼中獲取配置,而配置 key 不需提前定義
2.優(yōu)點
- 獲取的配置的 key 可不提前定義,程序靈活性高
- 配置 key 可使用枚舉統(tǒng)一放置與管理
3.缺點
- 使用較復雜,需繼承 Environment 接口形成工具類進行獲取
- 獲取 key 對應的枚舉與 key 定義分離,value 獲取鏈路較長
4.使用場景
- 只需使用少量的配置
- 獲取配置的 key 無提前定義,需要根據(jù)對配置的有無進行靈活使用
5.代碼示例
@Component public class ConfigByEnvironment implements EnvironmentAware { private static final Logger log = LoggerFactory.getLogger(ConfigByEnvironment.class); private Environment environment; public Optional<String> get(String configKey){ String config = environment.getProperty(configKey); return Objects.isNull(config) ? Optional.empty() : Optional.of(config); } public void get(String configKey, Consumer<String> consumer){ Optional<String> config = get(configKey); if(!config.isPresent()){ log.warn("application config, get config by key fail, key: {}", configKey); } config.ifPresent(consumer); } @Override public void setEnvironment(@NonNull Environment environment) { this.environment = environment; } } public enum ConfigByEnvironmentKey { SERVER_PORT("server.port", "server port"); private String key; private String description; ConfigByEnvironmentKey(String key, String description) { this.key = key; this.description = description; } public String getKey() { return key; } public String getDescription() { return description; } }
6.測試代碼
@DisplayName("multipart get config") @SpringBootTest public class MultipartGetConfigTest { private static final Logger log = LoggerFactory.getLogger(MultipartGetConfigTest.class); @Autowired private ConfigByEnvironment configByEnvironment; @Test public void getByEnvironment(){ configByEnvironment.get(ConfigByEnvironmentKey.SERVER_PORT.getKey()).ifPresent(value -> log.info("get by environment, value: {}", value)); } }
7.測試結(jié)果
org.spring.demo.MultipartGetConfigTest : get by environment, value: 7100
總結(jié)
獲取配置方式 | 優(yōu)點 | 缺點 | 使用場景 |
---|---|---|---|
通過 @Value 動態(tài)獲取單個配置 | 使用簡單,且使用關聯(lián)的鏈路較短 | 1. 配置名不能被有效枚舉到 2. 每一個配置的使用都需重新定義,使用較為麻煩 3. 項目強依賴配置的定義,配置不存在則會導致項目無法啟動 | 1. 項目強依賴該配置的加載,想要從源頭避免因配置缺失導致的未知問題 2. 只想使用少數(shù)幾個配置 |
通過 @ConfigurationProperties + 前綴方式批量獲取 | 1. 使用配置只需確定 key 的前綴即能使用,有利于批量獲取場景的使用 2. 因采用前綴匹配,所以在使用新的相同前綴 key 的配置時無需改動代碼 | 1. 使用復雜,需定義配置類或者手動創(chuàng)建 bean 后引入使用 2. 增加新的前綴相同 key 時可能會引入不穩(wěn)定因素 | 1. 需要同時使用多前綴相同 key 的配置 2. 期望增加新配置但不修改代碼的 properties 注入 |
通過 Environment 動態(tài)獲取單個配置 | 1. 獲取的配置的 key 可不提前定義,程序靈活性高 2. 配置 key 可使用枚舉統(tǒng)一放置與管理 | 1. 使用較復雜,需繼承 Environment 接口形成工具類進行獲取 2. 獲取 key 對應的枚舉與 key 定義分離,value 獲取鏈路較長 | 1. 只需使用少量的配置 2. 獲取配置的 key 無提前定義,需要根據(jù)對配置的有無進行靈活使用 |
以上就是詳解Spring獲取配置的三種方式的詳細內(nèi)容,更多關于Spring 獲取配置的資料請關注腳本之家其它相關文章!
相關文章
SpringBoot多數(shù)據(jù)源的兩種實現(xiàn)方式實例
最近在項目開發(fā)中,需要為一個使用MySQL數(shù)據(jù)庫的SpringBoot項目,新添加一個PLSQL數(shù)據(jù)庫數(shù)據(jù)源,下面這篇文章主要給大家介紹了關于SpringBoot多數(shù)據(jù)源的兩種實現(xiàn)方式,需要的朋友可以參考下2022-04-04詳細說明關于Java的數(shù)據(jù)庫連接(JDBC)
這篇文章主要介紹了詳細說明關于Java的數(shù)據(jù)庫連接JDBC,JDBC是用Java語言向數(shù)據(jù)庫發(fā)送SQL語句,需要的朋友可以參考下面文章內(nèi)容2021-09-09