@Value
此注解, 我们用的最多的是读取配置文件属性的:
@Value("${database.dirverName}")
String driverName;
这里的@Value中的${...}代表占位符, 它会读取上下文的属性值装配到属性中, 这就是一个最简单的SpringEL表达式, 通过SpringEL可以拥有更强大的运算规则来更好的装配Bean.
它能够调用方法, 例如, 我们记录一个Bean的初始化时间:
@Value("#{T(System).currentTimeMillis()}")
private Long initTime = null;
注意, 这里采用的#{...}代表启用SpringEL表达式, 它将具有运算功能, T(...)代表的是引入类, System是java.lang.*包的类, 这是java默认加载的包, 因此可以省略不写全限定类名, 如果是其他包, 需要写出全限定类名才能引用类. currentTimeMillis是它的静态方法, 也就是调用了一次System.currentTimeMillis()方法来为这个属性赋值.
此外还可以直接为属性赋值, 如下:
// 赋值字符串
@Value("#{'使用SpringEL赋值字符串'}")
private String str = null;
// 科学计数法赋值
@Value("#{9.3E3}")
private double d;
// 赋值浮点数
@Value("#{3.14}")
private float pi;
虽然这比较灵活, 但有时候我们还可能去获取其他Spring Bean的属性来给当前的Bean属性赋值, 例如:
@Value("#{beanName.str}")
private String otherBeanProp = null;
注意, 这里的beanName是Spring Ioc容器中某个Bean的名称, str是Bean的属性, 代表引用对应的Bean的属性str赋值给当前属性.有时候, 我们还希望这个属性的字母赋值时候全部变为大写, 这时候就可以写成:
@Value("#{beanName.str?.toUpperCase()}")
private String otherBeanProp = null;
再次注意这里的EL表达式, 这里引用的str后面跟着一个 ? , 这个符号?的含义是判断这个属性是否为空, 如果不为空才去执行后面的方法toUpperCase方法, 进而把属性变为大写, 赋值给当前属性.除此之外, 还可以使用SpringEL进行一定的运算, 如下:
// 数学运算
@Value("#{1+2}")
private int run;
// 浮点数比较运算
@Value("#{beanName.pi==3.14f}")
private bolean piFlag;
// 字符串比较
@Value("#{beanName.str eq 'Spring Boot'}")
private boolean strFlag;
// 字符换连接
@Value("#{beanName.str + ' 连接字符串'}")
private String strApp = null;
// 三目运算
@Value("#{beanName.d > 1000 ? '大于' : '小于'}")
private String resultDesc = null;
SpringEL能够支持的运算还有很多, 其中等值比较如果是数字的可以使用==比较, 如果是字符串的可以使用 eq 进行比较, 当然, EL的内容远远不止这些, 只是其他的EL表达式使用率没有这么高. 所以这里不再进一步讨论了.