Spring还提供了更灵活的注入方式——Spring表达式。Spring EL拥有很多功能:
- 使用Bean的id来引用Bean。
- 调用指定对象的方法和访问对象的属性。
- 进行运算。
- 提供正则表达式进行比配。
- 集合配置。
Bean的属性和方法
使用注解的方式需要用到注解@Value,在属性文件的读取中使用的是“$”,而在Spring EL中则使用“#”。下面我们以角色类为例进行分析,代码如下:
@Component(value = "role")
public class Role {
@Value("#{1}")
private Long id;
@Value("#{role_name_1}")
private String roleName;
@Value("#{role_note_1}")
private String note;
}
这样就可以定义一个BeanName为role的角色类,同时给予它所有的属性赋值,这个时候可以通过另外一个Bean去引用它的属性或者调用它的方法,比如先建一个类——ELBean类,代码如下:
@Component("elBean")
public class ELBean {
//通过beanName获取bean,然后注入
@Value("#{role}")
private Role role;
//获取bean的属性id
@Value("#{role.id}")
private Long id;
//调用bean的getNote方法,获取角色名称
@Value("#{role.getNote().toString()}")
private String note;
}
使用类的静态常量和方法
有时候我们可能希望使用一些静态方法和常量,比如圆周率Π,而在Java中就是Math类的PI常量,如果需要注入它,代码如下:
@Value("#{T(Math).PI}")
private double pi;
同样的,有时候需要使用Math类的静态方法去生产随机数,这个时候就需要使用它的random方法,代码如下:
@Value("#{T(Math).random()}")
private double random;
这样就可以通过调用类的静态方法加载对应的数据了。
Spring EL运算
Spring EL还可以进行运算,比如在ELBean上增加一个数字num,其值默认为要求是角色编号(id)+1,那么我们可以这么写:
@Value("#{role.id+1}")
private int num;
有时候“+”运算符也可以运用在字符串的连接上,代码如下:
@Value("#{role.roleName+role.note}")
private String str;
这样就能够得到一个角色名称和备注连接的字符串。
比较两个值是否相等,还有其他更多的比较,比如大于、小于等。
@Value("#{role.id==1}")
private boolean equalNum;
@Value("#{role.note eq 'note_1'}")
private boolean equalString;
@Value("#{role.id>2}")
private boolean greater;
在Java中,也许你会怀旧三目运算,我们也可以去实现这样的功能
@Value("#{role.id>1 ? 5:1}")
private int max;
@Value("#{role.note? : 'hello'}")
private String defaultString;