это возможно сделать с пружиной iBatis + - PullRequest
1 голос
/ 11 ноября 2009

Обычная идиома использования ibatis с пружинной опорой следующая. Или вот как я это делаю. пожалуйста, дайте мне знать, если это можно сделать лучше?

бобы xml:

<bean id="DataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="jdbc/some/som1/my/mydb"/>
</bean>
<bean id="SqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
  <property name="configLocation" value="classpath:sql-map-config-oracle.xml"/>
  <property name="dataSource" ref="DataSource"/>
</bean>
 <bean id="myDAO" class="com.reports.MyUserAccessDAO">
    <property name="sqlMapClient" ref="SqlMapClient"/>
    <property name="dataSource" ref="DataSource"/>
 </bean>

Интерфейс:

public interface MyUserAccessIface {
    public SomeBean getUserReports (String org);
}

DAO:

public class MyUserAccessDAO extends SqlMapClientDaoSupport implements MyUserAccessDAO {
    public SomeBean getUserReports (String org)
    {
      SomeBean bean = new SomeBean();
      //code for parameters goes here 
      getSqlMapClientTemplate().queryForList("namesp.userreport", parm);
      //fetch the result from parm and put them in SomeBean
      return bean
    }
}

вызов DAO:

MyUserAccessIface iBatisDAO = 
(MyUserAccessIface) ApplicationInitializer.getApplicationContext().getBean("myDAO");

, хотя это работает нормально, я не понимаю необходимость интерфейса.

Вопросы

  • Можно ли вынуть интерфейс из картина и до сих пор это работает?
  • можно ли изменить дизайн / настройки так, вызов DAO прост (даже если для этого требуется базовый абстрактный класс)

    MyUserAccessDAO mydao = new MyUserAccessDAO (); mydao.getUserReports ( "л");

Я задавал вопрос в том же духе пару дней назад, но после двухдневной борьбы и выяснения других вопросов я снова задал этот вопрос. Если возможно, предоставьте фрагменты кода того, что вы хотите изменить / добавить.

Модульное тестирование с этим дизайном не работает, потому что все находится внутри контейнера. Если мне это удастся, я добавлю это и к вопросу (для информационных целей).

Кроме того, я думаю, что для кого-то, кто пытается заставить весну и ибатис работать ... это могло бы стать хорошим началом.

Edit:

Как я уже упоминал выше, я хотел бы назвать свой DAO следующим образом (или я в порядке, передавая что-то вместе как параметр конструктора):

MyUserAccessDAO mydao = new MyUserAccessDAO(); mydao.getUserReports("blah");

Для достижения вышеуказанного у меня в DAO должна быть следующая строка

setSqlMapClient((SqlMapClient)ApplicationInitializer.getApplicationContext().getBean("SqlMapClient"));

Еще нужно знать, что все перезаписать, чтобы можно было написать контрольный пример для этого. Контрольный пример не сможет получить доступ к чему-либо внутри контейнера, поэтому он будет зависеть от источника данных драйвера ...

Так как я иду против лучшей практики здесь ... я не против поменять свой DAO исключительно для теста ...

Ответы [ 3 ]

2 голосов
/ 11 ноября 2009

Можно ли вытащить интерфейс из картинки, и он все еще работает?

Не вынимайте интерфейс. У него есть веская причина (например, генерация прокси для транзакций, AOP, макеты для тестирования в сервисах и т. Д.)

Почему ты хочешь вынуть это? Какой страх это вызывает у вас?

Можно ли изменить дизайн / настройки, чтобы просто вызывать DAO (даже если для этого требуется базовый абстрактный класс)

Почему ты называешь "новым"? Если вы используете Spring, вы должны вводить это, используя контекст приложения. Если вы называете «новым», это не под контролем Spring. В этом весь смысл.

0 голосов
/ 24 января 2010

Я могу думать о том, что 1 основной принцип, заключающийся в удалении интерфейса, нарушил бы ... «ориентацию на объект» и, самое главное, невозможность изменять сигнатуры методов без нарушения работы клиентов, вызывающих ваш код. Это само по себе остановит меня на пути. ХОРОШИЙ ВОПРОС! Во время многих встреч мне обычно задают этот вопрос. Или просто люди хотят программировать на абстрактные классы. =) * * Тысяча одна

0 голосов
/ 11 ноября 2009

Интерфейс предназначен для того, чтобы отделить вас от зависимости напрямую от реализации, что, в общем, является хорошей практикой. Все должно прекрасно работать без интерфейса, но лучше полагаться на абстракции, а не на реализации.

Что касается тестирования, то с помощью интерфейса становится намного проще тестировать код с использованием DAO, поскольку вы можете просто создать «фиктивную» реализацию этого, которая просто возвращает фиктивные данные и «внедрить» «это вручную в вашем модульном тесте - ваш клиентский код не может определить разницу между этим и настоящим DAO, поскольку все, что он знает, это интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...