java枚舉如何使用spring的@value注入屬性
java枚舉使用spring的@value注入屬性
背景:
在spring中使用@value注解來(lái)達(dá)到動(dòng)態(tài)配置線上和預(yù)發(fā)環(huán)境的參數(shù),在普通類(lèi)中可以隨意使用@value實(shí)現(xiàn),java枚舉enum無(wú)法注入,
怎么解決這個(gè)問(wèn)題?
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)部類(lèi)注入,重寫(xiě)枚舉屬性get方法來(lái)達(dá)到動(dòng)態(tài)替換的目的。
Spring @Value屬性注入使用總結(jié)
@Value注入
不通過(guò)配置文件的注入屬性的情況
通過(guò)@Value將外部的值動(dòng)態(tài)注入到Bean中,使用的情況有:
- 注入普通字符串
- 注入操作系統(tǒng)屬性
- 注入表達(dá)式結(jié)果
- 注入其他Bean屬性:注入beanInject對(duì)象的屬性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對(duì)象的屬性another,類(lèi)具體定義見(jiàn)下面 @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對(duì)象的屬性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
測(cè)試類(lèi):
@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)行測(cè)試類(lèi)
normal=normal systemPropertiesName=Windows 10 randomNumber=35.10603794922444 fromAnotherBean=其他Bean的屬性 resourceFile=test configuration file testUrl=<html>...<title>百度一下,你就知道</title>...略</html>
通過(guò)配置文件的注入屬性的情況
通過(guò)@Value將外部配置文件的值動(dòng)態(tài)注入到Bean中。
配置文件主要有兩類(lèi):
- application.properties。application.properties在spring boot啟動(dòng)時(shí)默認(rèn)加載此文件
- 自定義屬性文件。自定義屬性文件通過(guò)@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
下面通過(guò)@Value(“${app.name}”)語(yǔ)法將屬性文件的值注入bean屬性值,詳細(xì)代碼見(jiàn):
@Component // 引入外部配置文件組:${app.configinject}的值來(lái)自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; // 這里的值來(lái)自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)境變量對(duì)象,存儲(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(); } }
測(cè)試代碼:
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()); } }
測(cè)試運(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解析xml匯總_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了java解析xml匯總_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理的相關(guān)資料,需要的朋友可以參考下2017-07-07詳解mall整合SpringBoot+MyBatis搭建基本骨架
這篇文章主要介紹了詳解mall整合SpringBoot+MyBatis搭建基本骨架,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08一文帶你深入了解Java中延時(shí)任務(wù)的實(shí)現(xiàn)
延時(shí)任務(wù)相信大家都不陌生,在現(xiàn)實(shí)的業(yè)務(wù)中應(yīng)用場(chǎng)景可以說(shuō)是比比皆是。這篇文章主要為大家介紹幾種實(shí)現(xiàn)延時(shí)任務(wù)的辦法,感興趣的可以了解一下2022-11-11Mybatis中 mapper-locations和@MapperScan的作用
這篇文章主要介紹了Mybatis中 mapper-locations和@MapperScan的作用,mybatis.mapper-locations在SpringBoot配置文件中使用,作用是掃描Mapper接口對(duì)應(yīng)的XML文件,需要的朋友可以參考下2023-05-05關(guān)于mybatis3中幾個(gè)@Provider的使用方式
這篇文章主要介紹了關(guān)于mybatis3中幾個(gè)@Provider的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07