起因
一直的用法是 @Value("${jdbc.driverClass}")
这样,但在Spring官方文档里又看到 @Value("#{a.b}")
的用法。
结论
@Value的值有两类:
-
${ property : default_value }
:注入的是外部参数对应的property -
#{ obj.property? : default_value }
:SpEL表达式对应的内容
那个 default_value
,就是前面的值为空时的默认值。注意二者的不同。
例子
1、使用STS 新建一个Spring Boot项目,依赖部分留空。
2、在application.properties 文件中添加如下内容:
jdbc.driverClass=com.mysql
jdbc.url=3306@local
jdbc.user=admin
jdbc.pwd=pwd
3、新建类ValueDemo,内容如下:
package cn.larry.spring;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class ValueDemo {
@Value("${jdbc.driverClass}")
private String driver;
@PostConstruct
public void run(){
System.out.println(driver);
}
}
4、启动Spring Boot项目,输出如下:
这就是常用的
${properties}
,很简单。继续。
5、再新建一个类AnotherObj,内容如下:
package cn.larry.spring;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class AnotherObj {
@Value("${jdbc.user}")
private String name;
@Value("${jdbc.pwd}")
private String pwd;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
6、修改ValueDemo,如下:
package cn.larry.spring;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class ValueDemo {
@Value("${jdbc.driverClass}")
private String driver;
@Value("#{anotherObj.name}")
private String name;
@PostConstruct
public void run(){
System.out.println(driver);
System.out.println(name);
}
}
7、再次执行Spring Boot项目,结果如下:
这里展示的是 #{ SpEL }
的效果。
8、有意思的是,二者可以结合使用,如:#{ '${}' }
,注意单引号,注意不能反过来,测试如下。
application.properties文件中添加一行:media=jdbc.url
ValueDemo类修改如下:
package cn.larry.spring;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class ValueDemo {
@Value("${jdbc.driverClass}")
private String driver;
@Value("#{anotherObj.name}")
private String name;
// @Value("${ '#{anotherObj.media}' }") //这个不支持。
@Value("#{ '${media}' }")
private String media;
@PostConstruct
public void run(){
System.out.println(driver);
System.out.println(name);
System.out.println(media);
}
}
9、执行Spring Boot项目,结果如下:
另外,默认值很浅显,也不再测试了。