java枚舉如何使用spring的@value注入屬性
java枚舉使用spring的@value注入屬性
背景:
在spring中使用@value注解來達(dá)到動(dòng)態(tài)配置線上和預(yù)發(fā)環(huán)境的參數(shù),在普通類中可以隨意使用@value實(shí)現(xiàn),java枚舉enum無法注入,
怎么解決這個(gè)問題?
public enum SpringValueEnum {
TEACHER(0, "我是老師"),
STUDENT(1, "我是學(xué)生") {
@Override
public String getDesc() {
return PeopleEnumContainer.name;
}
};
private Integer code;
private String desc;
SpringValueEnum(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Component
static class PeopleEnumContainer {
private static String name;
@Value("${people.student.desc}")
public void init(String name) {
PeopleEnumContainer.name = name;
}
}
}如上,使用內(nèi)部類注入,重寫枚舉屬性get方法來達(dá)到動(dòng)態(tài)替換的目的。
Spring @Value屬性注入使用總結(jié)
@Value注入
不通過配置文件的注入屬性的情況
通過@Value將外部的值動(dòng)態(tài)注入到Bean中,使用的情況有:
- 注入普通字符串
- 注入操作系統(tǒng)屬性
- 注入表達(dá)式結(jié)果
- 注入其他Bean屬性:注入beanInject對象的屬性another
- 注入文件資源
- 注入U(xiǎn)RL資源
@Value("normal")
private String normal; // 注入普通字符串
@Value("#{systemProperties['os.name']}")
private String systemPropertiesName; // 注入操作系統(tǒng)屬性
@Value("#{ T(java.lang.Math).random() * 100.0 }")
private double randomNumber; //注入表達(dá)式結(jié)果
@Value("#{beanInject.another}")
private String fromAnotherBean; // 注入其他Bean屬性:注入beanInject對象的屬性another,類具體定義見下面
@Value("classpath:com/hry/spring/configinject/config.txt")
private Resource resourceFile; // 注入文件資源
@Value("http://www.baidu.com")
private Resource testUrl; // 注入U(xiǎn)RL資源注入其他Bean屬性:注入beanInject對象的屬性another
@Component
public class BeanInject {
@Value("其他Bean的屬性")
private String another;
public String getAnother() {
return another;
}
public void setAnother(String another) {
this.another = another;
}
}注入文件資源:com/hry/spring/configinject/config.txt
test configuration file
測試類:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@RunWith(SpringRunner.class)
@SpringBootTest(classes=Application.class)
public class ConfiginjectApplicationTest {
@Autowired
private BaseValueInject baseValueInject;
@Test
public void baseValueInject(){
System.out.println(baseValueInject.toString());
}
}運(yùn)行測試類
normal=normal systemPropertiesName=Windows 10 randomNumber=35.10603794922444 fromAnotherBean=其他Bean的屬性 resourceFile=test configuration file testUrl=<html>...<title>百度一下,你就知道</title>...略</html>
通過配置文件的注入屬性的情況
通過@Value將外部配置文件的值動(dòng)態(tài)注入到Bean中。
配置文件主要有兩類:
- application.properties。application.properties在spring boot啟動(dòng)時(shí)默認(rèn)加載此文件
- 自定義屬性文件。自定義屬性文件通過@PropertySource加載。@PropertySource可以同時(shí)加載多個(gè)文件,也可以加載單個(gè)文件。如果相同第一個(gè)屬性文件和第二屬性文件存在相同key,則最后一個(gè)屬性文件里的key啟作用。加載文件的路徑也可以配置變量,如下文的${anotherfile.configinject},此值定義在第一個(gè)屬性文件config.properties
第一個(gè)屬性文件config.properties內(nèi)容如下:
${anotherfile.configinject}作為第二個(gè)屬性文件加載路徑的變量值
book.name=bookName anotherfile.configinject=placeholder
第二個(gè)屬性文件config_placeholder.properties內(nèi)容如下:
book.name.placeholder=bookNamePlaceholder
下面通過@Value(“${app.name}”)語法將屬性文件的值注入bean屬性值,詳細(xì)代碼見:
@Component
// 引入外部配置文件組:${app.configinject}的值來自config.properties。
// 如果相同
@PropertySource({"classpath:com/hry/spring/configinject/config.properties",
"classpath:com/hry/spring/configinject/config_${anotherfile.configinject}.properties"})
public class ConfigurationFileInject{
@Value("${app.name}")
private String appName; // 這里的值來自application.properties,spring boot啟動(dòng)時(shí)默認(rèn)加載此文件
@Value("${book.name}")
private String bookName; // 注入第一個(gè)配置外部文件屬性
@Value("${book.name.placeholder}")
private String bookNamePlaceholder; // 注入第二個(gè)配置外部文件屬性
@Autowired
private Environment env; // 注入環(huán)境變量對象,存儲(chǔ)注入的屬性值
public String toString(){
StringBuilder sb = new StringBuilder();
sb.append("bookName=").append(bookName).append("\r\n")
.append("bookNamePlaceholder=").append(bookNamePlaceholder).append("\r\n")
.append("appName=").append(appName).append("\r\n")
.append("env=").append(env).append("\r\n")
// 從eniroment中獲取屬性值
.append("env=").append(env.getProperty("book.name.placeholder")).append("\r\n");
return sb.toString();
}
}測試代碼:
Application.java同上文
@RunWith(SpringRunner.class)
@SpringBootTest(classes=Application.class)
public class ConfiginjectApplicationTest {
@Autowired
private ConfigurationFileInject configurationFileInject;
@Test
public void configurationFileInject(){
System.out.println(configurationFileInject.toString());
}
}測試運(yùn)行結(jié)果
bookName=bookName
bookNamePlaceholder=bookNamePlaceholder
appName=appName
env=StandardEnvironment {activeProfiles=[], defaultProfiles=[default], propertySources=[Inlined Test Properties,systemProperties,systemEnvironment,random,applicationConfig: [classpath:/application.properties],class path resource [com/hry/spring/configinject/config_placeholder.properties],class path resource [com/hry/spring/configinject/config.properties]]}
env=bookNamePlaceholder
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java利用HttpClient模擬POST表單操作應(yīng)用及注意事項(xiàng)
本文主要介紹JAVA中利用HttpClient模擬POST表單操作,希望對大家有所幫助。2016-04-04
如何在Java中實(shí)現(xiàn)一個(gè)散列表
這篇文章主要介紹了如何在Java中實(shí)現(xiàn)一個(gè)散列表,建一個(gè)HashMap,以String類型為Key,Int類型為Value,下文具體的操作過程需要的小伙伴可以參考一下2022-04-04
使用GraalVM如何將SpringBoot項(xiàng)目打包成exe
本文介紹了如何使用GraalVM和Maven將Spring Boot項(xiàng)目打包成可執(zhí)行文件的步驟,并詳細(xì)解釋了在打包過程中遇到的常見錯(cuò)誤及其解決方法2024-12-12
SpringBoot中接收POST參數(shù)的幾種方式詳解
這篇文章主要介紹了SpringBoot中接收POST參數(shù)的幾種方式,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06

