Spring装配Bean(七) Spring的运行时注入

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的数据等等




猜你喜欢

转载自blog.csdn.net/ditto_zhou/article/details/80475342