Spring中两种运行时求值的方式
前面在xml中创建bean的时候,使用<construction-arg>注入属性的值的时候,采用硬编码,这种方式有时不是很合适,
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装配中,占位符形式${}包装属性名称.数据源后面再说
<bean id="helloWorld" class="com.erong.service.HelloWorld" scope="session"> <property name="message" value="${message}"></property> </bean>
如果我们依赖于组件扫描和自动装配来创建和初始化应用组件的话,不用指定占位符的配置文件或类
,这种情况下,使用@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属性中指定配置文件的位置
<!-- 使用占位符${}必须配置的bean --> <context:property-placeholder location="com/bing/config/app.properties"/>使用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的数据等等