Spring @Value 用法小結,#與$的區別


20161016更新:這貨其實是SpEL的功能,來這里看看吧:

Spring 4 官方文檔學習(五)核心技術之SpEL

 


 

起因

一直的用法是 @Value("${jdbc.driverClass}") 這樣,但在Spring官方文檔里又看到 @Value("#{a.b}")的用法。

於是研究了下。

結論

@Value的值有兩類:

${ property : default_value }

#{ obj.property? : default_value }

就是說,第一個注入的是外部參數對應的property,第二個則是SpEL表達式對應的內容。

那個 default_value,就是前面的值為空時的默認值。注意二者的不同。

例子

1、使用STS 新建一個Spring Boot項目,依賴部分留空。

2、在application.properties 文件中添加如下內容:

1 jdbc.driverClass=com.mysql
2 jdbc.url=3306@local
3 jdbc.user=admin
4 jdbc.pwd=pwd

3、新建類ValueDemo,內容如下:

 1 package cn.larry.spring;
 2 
 3 import javax.annotation.PostConstruct;
 4 
 5 import org.springframework.beans.factory.annotation.Value;
 6 import org.springframework.stereotype.Component;
 7 
 8 @Component
 9 public class ValueDemo {
10     @Value("${jdbc.driverClass}")
11     private String driver;
12     
13     @PostConstruct
14     public void run(){
15         System.out.println(driver);
16     }
17 
18 }

4、啟動Spring Boot項目,輸出如下:

這就是常用的 ${ properties },很簡單。繼續。

5、再新建一個類AnotherObj,內容如下:

 1 package cn.larry.spring;
 2 
 3 import org.springframework.beans.factory.annotation.Value;
 4 import org.springframework.stereotype.Component;
 5 
 6 @Component
 7 public class AnotherObj {
 8     @Value("${jdbc.user}")
 9     private String name;
10     @Value("${jdbc.pwd}")
11     private String pwd;
12 
13     public String getName() {
14         return name;
15     }
16 
17     public void setName(String name) {
18         this.name = name;
19     }
20 
21     public String getPwd() {
22         return pwd;
23     }
24 
25     public void setPwd(String pwd) {
26         this.pwd = pwd;
27     }
28 
29 }
View Code

6、修改ValueDemo,如下:

 1 package cn.larry.spring;
 2 
 3 import javax.annotation.PostConstruct;
 4 
 5 import org.springframework.beans.factory.annotation.Value;
 6 import org.springframework.stereotype.Component;
 7 
 8 @Component
 9 public class ValueDemo {
10     @Value("${jdbc.driverClass}")
11     private String driver;
12     
13     @Value("#{anotherObj.name}")
14     private String name;
15     
16     @PostConstruct
17     public void run(){
18         System.out.println(driver);
19         System.out.println(name);
20     }
21     
22 }

7、再次執行Spring Boot項目,結果如下:

這里展示的是 #{ SpEL }的效果。

8、有意思的是,二者可以結合使用,如:#{ '${}' } ,注意單引號,注意不能反過來,測試如下。

application.properties文件中添加一行:media=jdbc.url

ValueDemo類修改如下:

 1 package cn.larry.spring;
 2 
 3 import javax.annotation.PostConstruct;
 4 
 5 import org.springframework.beans.factory.annotation.Value;
 6 import org.springframework.stereotype.Component;
 7 
 8 @Component
 9 public class ValueDemo {
10     @Value("${jdbc.driverClass}")
11     private String driver;
12     
13     @Value("#{anotherObj.name}")
14     private String name;
15     
16 //    @Value("${ '#{anotherObj.media}' }") //這個不支持。
17     @Value("#{ '${media}' }")
18     private String media;
19     
20     @PostConstruct
21     public void run(){
22         System.out.println(driver);
23         System.out.println(name);
24         System.out.println(media);
25     }
26     
27 }

9、執行Spring Boot項目,結果如下:

 

另外,默認值很淺顯,也不再測試了。

有興趣的可以自行測試。

 

放個碼雲的地址上來,希望能幫到一些人。

項目地址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM