Spring动态注册bean实现动态多数据源(二)

2014-11-24 09:46:30 · 作者: · 浏览: 4
String beanKey = iter.next();
// 得到Bean定义,并添加到容器中
beanDefinition = new ChildBeanDefinition("dataSource");
// 注意:必须先注册到容器中,再得到Bean进行修改,否则数据源属性不能有效修改
acf.registerBeanDefinition(beanKey, beanDefinition);
// 再得到数据源Bean定义,并修改连接相关的属性
ComboPooledDataSource cpds = (ComboPooledDataSource)app.getBean( beanKey);;

cpds.setJdbcUrl(mapCustom.get(beanKey).connUrl);
cpds.setUser(mapCustom.get(beanKey).userName);
cpds.setPassword(mapCustom.get(beanKey).password);
}
}
/**
* 功能说明:解析属性文件,得到数据源Map
* @return
* @throws IOException
*/
private Map parsePropertiesFile(String fileName) throws IOException {
// 属性文件
ResourcePropertySource props = new ResourcePropertySource(fileName);

Matcher matcher;
Pattern pattern = Pattern.compile("^link\\.(eagle2\\.\\w+)\\.jdbc\\.(jdbcUrl|user|password)$");

Map mapDataSource = new HashMap();
// 根据配置文件解析数据源
for(String keyProp : props.getPropertyNames())
{
matcher = pattern.matcher(keyProp);
if(matcher.find()){
String dsName = matcher.group(1);
String dsPropName = matcher.group(2);
DataSourceInfo dsi;

if(mapDataSource.containsKey(dsName)){
dsi = mapDataSource.get(dsName);
}
else{
dsi = new DataSourceInfo();
}
// 根据属性名给数据源属性赋值
if("jdbcUrl".equals(dsPropName)){
dsi.connUrl = (String)props.getProperty(keyProp);
}else if("user".equals(dsPropName)){
dsi.userName = (String)props.getProperty(keyProp);
}else if("password".equals(dsPropName)){
dsi.password = (String)props.getProperty(keyProp);
}
mapDataSource.put(dsName, dsi);
}
}
return mapDataSource;
}

private class DataSourceInfo{
public String connUrl;
public String userName;
public String password;

public String toString(){

return "(JcbcUrl:"+connUrl+", user:"+userName+", password:"+password+")";
}
}
}

然后在beans.xml文件中添加配置
"ApplicationEventListener" class="com.dfsoft.hummer.domain.common.DynamicDataSourceC3p0" />
让spring在加载时调用DynamicDataSourceC3p0中的onApplicationEvent方法实现动态注册数据源。而原来实现多数据源动态切换的地方完全不用修改。
附加说明:
1、 做完上面的工作之后,在beans.xml中去掉原来的多数据源配置(已经没有用了)。
2、 acf.registerBeanDefinition不用判断容器中是否已经有相应名字的bean,spring会在该名称的bean存在时覆盖,不存在时添加。