我有一个配置了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
获得更好的实现吗?
答案 0 :(得分:1)
如果DocDao
和CustomDocDao
之间的唯一区别是dataSource,那么您可以使用不同的绑定简单地将同一个类实例化两次。
例如,如果删除@Component
注释并在XML中手动配置,则可以执行以下操作:
<bean id="docDao" class="myPackage.DocDao"
p:dataSource-ref="docDataSource" />
<bean id="customDocDao" class="myPackage.DocDao"
p:dataSource-ref="customDocDataSource" />