重构冗余DAO

时间:2015-06-08 19:50:47

标签: spring optimization groovy refactoring

我有一个配置了docDataSource的DocDao,如下所示

来自applicationContext.xml

docDataSource配置

<bean id="docDataSource"
    class="org.apache.tomcat.jdbc.pool.DataSource" 
    destroy-method="close"
    p:driverClassName="${doc.database.driver}" 
    p:url="${doc.database.url}"
    p:username="${doc.database.user}" 
    p:password="${doc.database.password}"
    p:validationQuery="select 1" 
    p:testOnBorrow="true" 
    p:minIdle="2" 
    p:maxIdle="4" 
    p:maxActive="6" 
    p:defaultTransactionIsolation="1">
</bean>

以下是我的DAO课程

@Component
public class DocDao implements GroovyInterceptable {

    @Autowired
    private Services services

    @Autowired
    @Qualifier("docDataSource")
    private DataSource            dataSource

    def conn

    def getConnection() {
        if (conn != null) return conn;
        conn = Sql.newInstance(dataSource)
        conn
    }
    // implementation for CRUD operations
}

我要求使用不同的dataSource创建DAO,因此我在customDocDataSource中添加了一个新的bean applicationContext.xml,如下所示

<bean id="customDocDataSource"
    class="org.apache.tomcat.jdbc.pool.DataSource" 
    destroy-method="close"
    p:driverClassName="${customDoc.database.driver}" 
    p:url="${customDoc.database.url}"
    p:username="${customDoc.database.user}" 
    p:password="${customDoc.database.password}"
    p:validationQuery="select 1" 
    p:testOnBorrow="true" 
    p:minIdle="2" 
    p:maxIdle="4" 
    p:maxActive="6" 
    p:defaultTransactionIsolation="1">
</bean>

并创建了一个新的DAO,如下所示

@Component
public class CustomDocDao implements GroovyInterceptable {

        @Autowired
        private Services services

        @Autowired
        @Qualifier("customDocDataSource")
        private DataSource            dataSource

        def conn

        def getConnection() {
            if (conn != null) return conn;
            conn = Sql.newInstance(dataSource)
            conn
        }
        // implementation for CRUD operations
    }

新的CustomDAO工作正常但它看起来像代码味道。有人可以帮我重构一下并为CustomDocDao获得更好的实现吗?

1 个答案:

答案 0 :(得分:1)

如果DocDaoCustomDocDao之间的唯一区别是dataSource,那么您可以使用不同的绑定简单地将同一个类实例化两次。

例如,如果删除@Component注释并在XML中手动配置,则可以执行以下操作:

<bean id="docDao" class="myPackage.DocDao" 
    p:dataSource-ref="docDataSource" />
<bean id="customDocDao" class="myPackage.DocDao" 
    p:dataSource-ref="customDocDataSource" />