一直的用法是 @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项目,结果如下:
另外,默认值很浅显,也不再测试了。