依赖运行时注入值(非Bean),就是在运行的时候求值,可以避免在源码中进行硬编码:
运行时注入有三种方法:
第一种:注入外部的值
1.处理外部值的一个方法是先声明属性来源,然后通过Spring的Environment来检索属性。
使用@PropertySource注解来声明属性源。
例:假设类FirstClass的构造器要注入两个String参数。
@Configuation
@PropertySource("classpath:属性来源的路径") //声明属性来源
public class MyConfig
{
@Autowired
Environment env;
@Bean
public FirstClass firstClass()
{
renturn new FirstClass(env.getProperty("属性名1"),env.getProperty("属性名2"));
}
}
属性源的文件内容类似于:
属性名1=值
属性名2=值
Environment的getProperty()方法有四个重载版本:
1.String getProperty(String key) //根据key返回相应属性的值。返回的值是String。
2.String getProperty(String key,String defaultValue) //提供一个默认值,如果属性不存在,则使用这个默认值。返回的值是String。
3.T getProperty(String key,Class<T> type) //返回的值不一定是String,可以是其他的类型
4.T getProperty(String key,Class<T> Type,T defaultValue) //与上面一个版本一样,只是当属性未定义时使用默认值。
第二种方法:使用占位符
1.占位符的形式使用{…..}。
要使用占位符我们必须配置PropertyPlaceHolderConfigurer Bean 或者PropertySourcesPlaceHolderConfigurer。
Spring3.1之前必须使用PropertyPlaceHolderConfigurer
Spring3.1之后两种的可以使用,但推荐PropertySourcesPlaceHolderConfigurer,应为他能够基于Spring Environment 及其属性源来解析占位符。
<bean id="firstClass" class="com.FirstClass">
<construct-arg value={"属性名1"}/> //通过Xml配置
<construct-arg value={"属性名2"}/>
</bean>
--------------------------------------------------------------------
@Configuation
public class MyConfig //通过JavaConfig配置
{
@Bean
public FirstClass firstClass(@Value("{属性名1}") String a,@Value("{属性名2}") String b)
{
return new FristClass(a,b);
}
}
第三种:使用Spring表达式语言(SpEL)来进行装配:
SpEL支持的特性包括:
1.能使用Bean的ID来引用Bean。
2.可以调用方法和访问对象的属性。
3.可以对值进行算数,关系,逻辑运算。
4.可以使用正则表达式。
5.可以对集合进行操作。
SpEL表达式要放在#{…}中。
public FirstClass firstClass(@Value("#{属性名1}") String a,@Value("#{属性名2}"} String b)
{
return new FirstClass(a,b);
}
一:SpEL表示字面量:
#{3.1415}
#{'Hello Word'}
#{false}
二:引用Bean,属性,方法
#{Bean id}
#{Bean id.属性名}
#{Bean id.方法名(参数)}
三:使用类型
使用类型要用T
例:
T(java.lang.Math).PI
T(java0lang.Math).random()