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

20161016更新:這貨實際上是SpEL的功能,來這裏看看吧:html

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

 


 

原由mysql

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

因而研究了下。spring

結論sql

@Value的值有兩類:app

${ property : default_value }ide

#{ obj.property? : default_value }學習

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

那個 default_value,就是前面的值爲空時的默認值。注意兩者的不一樣。

例子

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

二、在application.properties 文件中添加以下內容:

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

三、新建類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 }

四、啓動Spring Boot項目,輸出以下:

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

五、再新建一個類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

六、修改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 }

七、再次執行Spring Boot項目,結果以下:

這裏展現的是 #{ SpEL }的效果。

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

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 }

九、執行Spring Boot項目,結果以下:

 

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

有興趣的能夠自行測試。

 

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

項目地址

相關文章
相關標籤/搜索