Spring @Value 用法小结,#与$的区别

来源:互联网 发布:纳什均衡和福利最优化 编辑:程序博客网 时间:2024/05/22 08:00

文章转载自:http://www.cnblogs.com/larryzeal/p/5910149.html

起因

一直的用法是 @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.mysql2 jdbc.url=3306@local3 jdbc.user=admin4 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     @PostConstruct14     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 }
复制代码

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     @PostConstruct17     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     @PostConstruct21     public void run(){22         System.out.println(driver);23         System.out.println(name);24         System.out.println(media);25     }26     27 }
复制代码

9、执行Spring Boot项目,结果如下:

 

另外,默认值很浅显,也不再测试了
0 0
原创粉丝点击