2009-07-09 4 views
1

У меня есть несколько классов DAO, которые расширяют SqlMapClientDaoSupport и вызывают getSqlMapClientTemplate() для запуска запросов iBatis.Весна: заменить SqlMapClientTemplate для всех клиентов?

Для конкретного теста я хочу заменить возвращаемый объект, когда каждый DAO вызывает getSqlMapClientTemplate(), с моим собственным пользовательским классом.

Как я могу это сделать?

Я знаю, что есть setSqlMapClientTemplate(org.springframework.orm.ibatis.SqlMapClientTemplate); однако это создает две проблемы.

1) Я хочу, чтобы замена была «глобальной» для моей конфигурации Spring; Я не хочу, чтобы вы звонили в каждый DAO.

2), что сеттер принимает SqlMapClientTemplate вместо интерфейса SqlMapClientTemplate орудий (SqlMapClientOperations), так это выглядит, как будто мне нужно подкласс SqlMapClientTemplate, а не просто делать свою собственную реализацию интерфейса «SqlMapClientOperation в.

Как для конкретной конфигурации пружин я могу во всем мире заменить SqlMapClientTemplate, возвращенный из всех вызовов, на getSqlMapClientTemplate()?

Спасибо.

ответ

2

Либо использовать какое-то АОП или иметь все бин в вашем контексте расширения абстрактного определения:

<bean id="baseDao" abstract="true"> 
    <property name="sqlMapClientTemplate" ref="yourNewClientTemplate"/> 
</bean> 

<bean id="specificDao" class="com.companyname.class" parent="baseDao" > 
... 
</bean> 
+0

Я думаю, что подход абстрактного определения является лучшим. Я не уверен, что подход AOP будет работать в этом случае. Он работает только тогда, когда расширенный объект вводится в другой объект, а не для внутренних вызовов этого метода. Без дополнительной работы. – laz

0

This item here идет над подобным вопросом. Я переписал свои DAO, чтобы использовать SqlMapClientOperations в качестве параметра, что упрощает и упрощает тестирование, но вы можете использовать Mockito, как в приведенной ссылке.

Смежные вопросы