从春天上下文创建spring bean之后的Spring set属性

时间:2012-10-16 19:11:19

标签: spring

我有一个spring数据源如下,在核心模块中有自己的spring上下文我不想设置maxActivetime

<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>

我有依赖模块,它取决于具有自己的弹簧上下文的核心模块,在这个组件中我想设置数据源maxIdle时间

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

还有许多其他模块也依赖于wssModelDataSource,但我不想为它们改变maxIdle时间。

我的问题是,如果我将<property name="wssModelDataSource.maxIdle" value="40"/>放在spring上下文文件的根目录下,则会给出错误

2 个答案:

答案 0 :(得分:2)

你可以这样做:

使用常见的道具定义一个抽象的基础bean:

<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>

答案 1 :(得分: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;
    }
}