如果我们的应用是以集群的方式部署,或者我们希望在运行期间能够动态调整引用的某些配置值,这时,就必须将配置信息放到数据库。因为这样不但方便集中管理,而且可以通过应用系统的管理界面对其进行动态维护,从而可以有效地增强应用系统的可维护性 。
Spring3+ 中,我们可以通过 #{beanName.propertyName}
的方式来引用另外一个 Bean 的属性值 。
假设我们的应用系统中,需要动态配置【尝试登陆的次数】,我们把它定义在数据库中,然后在通过 SysConfig 类对其进行加载:
public class SysConfig {
/**
* 尝试登陆的次数
*/
private int tryLoginNum;
private BasicDataSource dataSource;
public void init() {
//假设从数据库中加载配置信息
this.tryLoginNum = 3;
}
public int getTryLoginNum() {
return tryLoginNum;
}
public void setDataSource(BasicDataSource dataSource) {
this.dataSource = dataSource;
}
}
SysManager 是系统管理类,它需要获取 SysConfig 中的配置项,SysManager 定义如下:
public class SysManager {
private int tryLoginNum;
public int getTryLoginNum() {
return tryLoginNum;
}
public void setTryLoginNum(int tryLoginNum) {
this.tryLoginNum = tryLoginNum;
}
}
xml 配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 引入外部属性文件-->
<!-- 使用自定义属性配置器(解密转换)-->
<bean class="net.deniro.spring4.properties.CustomPropertyPlaceholderConfigurer"
p:location="classpath:system.properties"
p:fileEncoding="utf-8"/>
<!-- 数据源-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
p:driverClassName="${driverClassName}"
p:url="${url}"
p:username="${username}"
p:password="${password}"/>
<!-- 从数据源中获取系统的配置信息-->
<bean id="sysConfig" class="net.deniro.spring4.properties.SysConfig"
init-method="init" p:dataSource-ref="dataSource"/>
<!-- 引用其它 Bean(sysConfig)的属性值-->
<bean id="sysManager" class="net.deniro.spring4.properties.SysManager"
p:tryLoginNum="#{sysConfig.tryLoginNum}"/>
</beans>
这里在定义 sysConfig bean 时,通过 init-method 属性指定初始化方法,再此方法中从数据库加载配置信息,然后保存在 sysConfig 的属性中。然后就可以通过 #{beanName.propertyName}
格式来动态指定其它 Bean 的属性值啦 O(∩_∩)O哈哈~
注意: 格式中是 #{xxx}
,而不是 ${xxx}
。
在基于注解或基于 JAVA 类的 Bean 配置中,可以通过 @Value(“#{beanName.propertyName}”)
的注解形式来引用其它 Bean 的属性值 。