Spring中两种运行时求值的方式
前面在xml中创建bean的时候,使用
Spring提供了下面方式实现,运行时注入值
1. 属性占位符(Property placeholder)
2. Spring表达式语言(SpEL)
属性占位符
* JavaConfig中使用注解@PropertySource注解和Environment
@Configuration
@PropertySource("classpath:com/bing/config/app.properties")
public class ExpressiveConfig {
@Autowired
Environment env;
@Bean
public HelloWorld gethelloWorld(){
return new HelloWorld(env.getProperty("message"));
}
}
app.properties文件中
message = hello world!
@PropertySource引用了类路径中一个名为app.properties的文件,会将属性文件加载到Spring的Environment中,在使用Environment的方法获取属性值。
Environment的getProperty()方法:
,另外Environment提供了一些方法检查profile是否处在激活状态
* XML解析属性占位符
Spring支持将属性定义到外部的属性的文件中,并且使用占位符值将其他插入到Spring bean中。在Spring装配中,占位符形式${}包装属性名称.数据源后面再说
如果我们依赖于组件扫描和自动装配来创建和初始化应用组件的话,不用指定占位符的配置文件或类
,这种情况下,使用@Value注解,构造器可以改成如下所示:
@Component
public class HelloWorld {
private String message;
public HelloWorld(@Value("${message}") String message){
this.message = message;
}
public void setMessage(String message) {
this.message = message;
}
public String getMessage() {
return "Your Message: " + message;
}
}
为了使用占位符,必须要配置一个PropertySourcesPlaceholderConfigurer,能够基于SpringEnvironment及其属性源解析占位符
JavaConfig中配置这个Bean,注意要写在配置类中
@Bean
public PropertySourcesPlaceholderConfigurer getpspc(){
return new PropertySourcesPlaceholderConfigurer();
}
XML中配置这个Bean,在location属性中指定配置文件的位置
使用Spring表达式语言进行装配
SpEL特性,包括:
* 使用bean的ID来引用bean;
* 调用方法和访问对象的属性;
* 对值进行算术、关系和逻辑运算;
* 正则表达式匹配;
* 集合操作
SpEL表达式要放到#{} 之中。
例如:
1. #{T(System).currentTimeMills()}计算结果ms数,T()将java.lang.System视为Java中对应的类型。因而看可以调用方法
2. 通过systemProperties对象引用系统属性 #{systemProperties['disc.title']}
具体看下SpEL的使用
1. 表示字面值 ,表示浮点数、String值以及Boolean值 #{3.21} #{'hello'} #{false}
2. 调用Bean的属性和方法.
#{sgtPeppers.artist} 获取BeanID为sgtPeppers的bean的artist的属性
#{artistSelector.selectArtis()?toUppperCase()} ?运算符号,在访问右边的内容前,确定是否是null
3. 在表达式中使用类型
需要使用T()运算符 #{T(java.lang.Math)}
* SpEL运算符
算术、比较、逻辑、条件运算符、三元运算符
* SpEL计算集合
[]运算符用来从集合或者数组中按照索引获取元素 #{'This is a test'[3]} index基于零开始
总的来说,在Spring装配Bean时候:
1. Spring占位符号${} ,适合注入一些常量数据,从配置文件中读取数据
2. Spring表达式#{}合适注入一些动态的数据,另一个Bean的数据等等