SpringBoot的屬性賦值@Value的用法說明
今天學(xué)習(xí)到了SpringBoot 的屬性賦值@Value用法
先總結(jié)
@Value(" 張三 ")
:直接附在屬性名上,在Bean初始化時(shí),會(huì)賦初始值@Value(" #{ 20 - 2 } ")
:可以用 #{ },里面可以寫表達(dá)式,當(dāng)然也可以直接 @Value(" #{ 18 } ") 或 @Value(" 18 ")@Value(" ${ person.name } ")
:利用 ${ } 可以取出配置文件中的值
例子
配置類:
@PropertySource(value={"classpath:/person.properties"}) @Configuration public class MainConfigOfPropertyValues { ? ?? ?@Bean ?? ?public Person person() { ?? ??? ?return new Person(); ?? ?}?? ? }
@Configuration
:告訴 Spring 這是一個(gè)配置類@PropertySource
:關(guān)聯(lián)配置文件,使用 @PropertySource 指定讀取外部配置文件,保存到運(yùn)行的環(huán)境變量中,然后可以用@Value(" ${ person.name } ") 獲取環(huán)境變量中的值。
Bean :
public class Person {? ?? ?/* ?? ? * 使用@Value賦值: ?? ? * ?? ?1. 基本數(shù)值 ?? ? * ?? ?2. 可以寫 #{ } ?? ? * ?? ?3. 可以寫 ${ },取出配置文件{properties}中的值 ?? ? */ ?? ? ?? ?@Value("張三") ?? ?private String name; ?? ?@Value("#{20-2}") ?? ?private int age; ?? ?@Value("${person.nickName}") ?? ?private String nickName; ?? ? ?? ?public String getNickName() { ?? ??? ?return nickName; ?? ?} ?? ?public void setNickName(String nickName) { ?? ??? ?this.nickName = nickName; ?? ?} ?? ?public String getName() { ?? ??? ?return name; ?? ?} ?? ?public void setName(String name) { ?? ??? ?this.name = name; ?? ?} ?? ?public int getAge() { ?? ??? ?return age; ?? ?} ?? ?public void setAge(int age) { ?? ??? ?this.age = age; ?? ?} ?? ?@Override ?? ?public String toString() { ?? ??? ?return "Person [name=" + name + ", age=" + age + ", nickName=" + nickName + "]"; ?? ?} ?? ?public Person(String name, int age, String nickName) { ?? ??? ?super(); ?? ??? ?this.name = name; ?? ??? ?this.age = age; ?? ??? ?this.nickName = nickName; ?? ?} ?? ?public Person() { ?? ??? ?super(); ?? ??? ?// TODO Auto-generated constructor stub ?? ?}?? ? }
配置文件:
person.nickName=\u5C0F\u4E09
這里面的 \u5C0F\u4E09 表示的是“小三”
而配置文件的位置:
運(yùn)行:
public class IOCTest_PropertyValue { //容器創(chuàng)建 AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfPropertyValues.class); //打印容器中Bean的name private void printBeans(AnnotationConfigApplicationContext applicationContext) { String[] definitionName = applicationContext.getBeanDefinitionNames(); for(String name : definitionName) { System.out.println(name); } } @Test public void test01() { printBeans(applicationContext); System.out.println("-------------------------------------------------------"); //獲得容器中的Person Person person = (Person) applicationContext.getBean("person"); System.out.println(person); //獲得環(huán)境變量中的值 ConfigurableEnvironment environment = applicationContext.getEnvironment(); String property = environment.getProperty("person.nickName"); System.out.println("環(huán)境變量:"+property); applicationContext.close(); } }
運(yùn)行結(jié)果:
@Value的使用及注意事項(xiàng)
為什么使用
使用@Vlue可以實(shí)現(xiàn)對(duì)于線上項(xiàng)目的一些通用配置的修改;或者修改項(xiàng)目中可能出現(xiàn)變動(dòng),但是卻又有很多地方都在使用的一些參數(shù),這樣我們我可直接通過修改配置文件而不用修改代碼的方式來達(dá)到參數(shù)的修改的目的
參數(shù)形式
yml文件
(簡(jiǎn)單的參數(shù))
test1: ? ? ?num: 1 ? ? ?name: xiaoming
獲取數(shù)據(jù)
@Value("${test1.num}") private int num; @Value("${test1.name}") private String name;
(數(shù)組||集合)
test: ? array1: aaa,bbb,ccc ? array2: 111,222,333 ? array3: 11.1,22.2,33.3 ? list1: ddd,eeee,111,333,222,444
獲取數(shù)據(jù)
//數(shù)組 @Value("${test.array1:}") private String[] array1; //集合 @Value("#{'${test.list1:}'.split(',')}") private List<String> list1; //集合進(jìn)一步做空數(shù)據(jù)處理 @Value("#{'${test.list:}'.empty ? null : '${test.list:}'.split(',')}") private List<String> testList;
(Map)
test: ? map1: '{"name": "zhangsan", "sex": "male"}' ? map2: '{"math": "90", "english": "85"}'
獲取數(shù)據(jù)
@Value("#{${test.map2}}") private Map<String,String> map1; @Value("#{${test.map2}}") private Map<String,Integer> map2;
前置條件(注意事項(xiàng))
想要能夠很好的使用的使用@Value 需要注意一些前置條件
1. 使用正確的注解
@Value的使用要找對(duì)目標(biāo),我們所使用的注解的引用時(shí)這樣的
2. yml文件的格式
如果你使用的是yml文件的話,需要注意yml文件的注意格式問題 ,基本上參數(shù)名之后的冒號(hào)之后都要加空格,一般情況下,冒號(hào)后面加了空格,參數(shù)名都會(huì)變?yōu)樗{(lán)色
3. @Value使用的環(huán)境要求
- 不能作用于靜態(tài)變量(static);
- 不能作用于常量(final);
- 不能在非注冊(cè)的類中使用(類需要被注冊(cè)在spring上下文中,如用@Service,@RestController,@Component等);
- 使用這個(gè)類時(shí),只能通過依賴注入的方式,用new的方式是不會(huì)自動(dòng)注入這些配置的。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
參數(shù)校驗(yàn)Spring的@Valid注解用法解析
這篇文章主要介紹了參數(shù)校驗(yàn)Spring的@Valid注解用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08SpringMVC實(shí)現(xiàn)文件上傳下載的全過程
對(duì)于上傳功能,我們?cè)陧?xiàng)目中是經(jīng)常會(huì)用到的,比如用戶注冊(cè)的時(shí)候,上傳用戶頭像,這個(gè)時(shí)候就會(huì)使用到上傳的功能,而對(duì)于下載使用場(chǎng)景也很常見,下面這篇文章主要給大家介紹了關(guān)于SpringMVC實(shí)現(xiàn)文件上傳下載的相關(guān)資料,需要的朋友可以參考下2022-01-01理解Java中的靜態(tài)綁定和動(dòng)態(tài)綁定
這篇文章主要幫助大家理解Java中的靜態(tài)綁定和動(dòng)態(tài)綁定,在Java中存在兩種綁定方式,一種為靜態(tài)綁定,另一種就是動(dòng)態(tài)綁定,亦稱為后期綁定,感興趣的小伙伴們可以參考一下2016-02-02