转载

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

一直的用法是 @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项目,结果如下:

另外,默认值很浅显,也不再测试了。

原文  https://juejin.im/post/5d2341ecf265da1bd26110ba
正文到此结束
Loading...