将应用系统的配置信息放在配置文件中并非总是最合适的。如果应用系统是以集群方式部署的,或者希望在运行期动态调整应用系统的某些属性,这时,将配置信息放在数据库中不但方便集中管理,而且可以通过应用系统的管理界面动态维护,有效增强应用系统的可维护性,方便管理。
在Spring3.0中,我们可以通过类似于#{beanName.benaProp}的方式方便地引用另一个Bean的值。
package com.baobaotao.beanprop;
public class SysConfig{
private int sessionTimeout;
private int maxTabPageNum;
private DataSource dataSource;
//模拟从数据库中获取配置值并设置相应的属性
public void initFromDB(){
this.sessionTimeout=30;
this.maxTabPageNum=10;
}
public int getSessionTimeout(){
return sessionTimeout;
}
public int getmaxTabPageNum{
return getmaxTabPageNum;
}
public void setDataSource(DataSource dataSource){
this.dataSource=dataSource;
}
}
<context:property-placeholder
location="classpath:com/baobaotao/placeholder/jdbc.properties"/>
<bean id="dataSource" class=org.apache.commons.dbcp.BasicDataSource
destroy-method="close"
p:driverClassName="${driverClassName}"
p:url="${url}"
p:username="${userName}"
p:password="${password}"/>
<!--通过initFromDB方法从数据源中获取配置属性值-->
<bean id="sysConfig" class="com.baobaotao.beanprop.SysConfig"
init-method="initFromDB"
p.dataSource-ref="dataSource"/>
<!-- 引用Bean的属性值-->
<bean class="com.baobaotao.beanprop.ApplicationManager"
p:maxTabPageNum="#{sysConfig.maxTabPageNum}"
p:sessionTimeout="#{sysConfig.sessionTimeout}"/>
访问数据库获取配置属性的前提是连接到数据库之中,所以不管如何,我们还是得使用外部属性文件配置数据库的连接信息。然后通过sysConfig的initFromDB()方法访问数据库,获取应用系统的配置信息,并将其保存在sysConfig的属性中。
其他需要访问应用系统配置信息的Bean即可通过#{sysConfig.propName}的表达式引用sysConfig的属性值了。
在基于注解和基于Java类配置的Bean中,可以通过@Value("#{beanName.propName}")的注解形式引用Bean的属性值:
package com.baobaotao.beanprop;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class ApplicationManager{
@Value("#{sysConfig.sessionTimeout}")
private int sessionTimeout;
@Value("#{sysConfig.maxTabPageNum}")
private int maxTabPageNum;
...
}