运行时注入
避免在配置bean时的硬编码
如
@Bean
public CompactDisc sgtPeppers(){
return new BlankDisc("Sgt...","The Beatles");
}
<bean id="sgtPeppers" class="..."
c:_title="Sgt..."
c:_artist="The Beatles" />
上面两种直接传递实际的值可理解为硬编码
避免硬编码 Spring提供了两种运行时求值的方式
- 属性占位符
- Spring表达式语言(SpEL)
注入外部的值
spring中处理外部值最简单的方式就是生命属性源并通过Spring的Environment来检索属性
@Configuration
@PropertySource("classpath:/com/soundsystem/app.properties")//声明属性源
public class ExpressiveConfig{
@Autowired
Environment env;
@Bean
public BlankDisc disc(){
return new BlankDisc(env.getProperty("disc.title","disc.artist"));
}
}
Environment提供的属性相关方法
getProperty() 方法有四种重载的变种形式
- String getProperty(String key)
- String getProperty(String key,String default)
- T getProperty(String key,Class type)
- T getProperty(String key,Class type,T default)
其他属性相关方法
getRequiredProperty(“”) 要获取的属性必须要定义否则跑出IllegalStateException
containsProperty(“”) 某个属性是否存在
Environment检查profile的方法
String[] getActiveProfiles() 返回激活profile名称的数组
String[] getDefaultProfiles() 返回默认profile名称数组
boolean acceptProfiles(String …profiles) 如果Environment支持给定的profile的话就返回true
——————-\
解析属性占位符
Spring一直支持将属性定义到外部属性文件中,并通过占位符值将其插入到bean中,占位符的形式为使用“${…}”包装的属性名称
public BlankDisc(@Value("${disc.title}" ) String title,@Value("${disc.artist}") String artist){
this.title = title;
this.artist = artist;
}
<bean id="" class=""
c:_title="${disc.title}"
c:_artist="${disc.artist}" />
为了使用占位符,必须要配置一个PropertyPlaceholderCOnfigurer bean 或者 PropertySourcesPlaceholderConfigurer bean
从spring3.1 开始推荐使用后者 因为它能基于spring Environment及其属性源解析占位符
@Bean
public static PropertySourcesPlaceholderConfigurer placeholderConfigurer(){
return new PropertySourcesPlaceholderConfigurer();
}
或在xml配置中
<beans ....>
<context:property-placeholder />