2012-10-16 19 views
1

我有一个春天的数据源如下,有自己的Spring上下文核心模块中我不想设定maxActivetime弹簧组属性从春天上下文创建的Spring bean的后

<bean id="wssModelDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="net.sourceforge.jtds.jdbcx.JtdsDataSource"/> 
    <property name="url" value="com.wss.jdbc.ConnectionUrl=jdbc:jtds:sqlserver://x-x2/x_control_QA;appName=wss;sendStringParametersAsUnicode=false;loginTimeout=20;socketTimeout=180"/> 
    <property name="username" value="xxx"/> 
    <property name="password" value="xxx"/> 
    </bean> 

我有相关的模块,取决于它有它自己的Spring上下文,并在此组件我想设置数据源了maxidle时间

<property name="wssModelDataSource.maxIdle" value="40"/> 

,还有许多其他模块也取决于wssModelDataSource但我dno't想更改了maxidle时间核心模块他们。

我的问题是,如果我把<property name="wssModelDataSource.maxIdle" value="40"/>在Spring上下文文件时,它给人的根我错误

回答

2
<bean class="com.wss.spring.DataSourcePropertyOverrider" > 
    <property name="maxIdle" value="#{com.wss.jdbc.MaximumIdleConnections}"/> 
    <property name="minIdle" value="#{com.wss.jdbc.MinimumIdleConnections}"/> 
    <property name="initialSize" value="#{com.wss.jdbc.InitConnectionSize}"/> 
     </bean> 

创建的BeanFactoryPostProcessor实现和覆盖postProcessBeanFactory方法

public class DataSourcePropertyOverrider implements BeanFactoryPostProcessor { 

    private int maxIdle; 
    private int minIdle; 
    private int initialSize ; 
    /** 
    * 
    * @param beanFactory 
    * @throws BeansException 
    */ 
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { 
     BasicDataSource dataSource = (BasicDataSource)beanFactory.getBean("wssModelDataSource"); 

     if(dataSource != null){ 
      dataSource.setMaxIdle(maxIdle); 
      dataSource.setMinIdle(minIdle); 
      dataSource.setInitialSize(initialSize); 
     } 

     //To change body of implemented methods use File | Settings | File Templates. 
    } 


    public int getMaxIdle() { 
     return maxIdle; 
    } 

    public void setMaxIdle(int maxIdle) { 
     this.maxIdle = maxIdle; 
    } 

    public void setMinIdle(int minIdle) { 
     this.minIdle = minIdle; 
    } 

    public int getMinIdle() { 

     return minIdle; 
    } 

    public int getInitialSize() { 
     return initialSize; 
    } 

    public void setInitialSize(int initialSize) { 
     this.initialSize = initialSize; 
    } 
} 
2

可以代替做到这一点:

定义的抽象基豆与普通道具:

<bean id="baseDatasource" abstract="true" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="net.sourceforge.jtds.jdbcx.JtdsDataSource"/> 
    <property name="url" value="com.wss.jdbc.ConnectionUrl=jdbc:jtds:sqlserver://x-x2/x_control_QA;appName=wss;sendStringParametersAsUnicode=false;loginTimeout=20;socketTimeout=180"/> 
    <property name="username" value="xxx"/> 
    <property name="password" value="xxx"/> 

    </bean> 

现在定义您的孩子数据源,根据需要进行特定修改:

<bean id="wssModelDataSource" parent="baseDatasource"> 
    <property name="maxIdle" value="40"> 
</bean>