Внедрение DAO с помощью Spring - PullRequest
0 голосов
/ 09 февраля 2012

Я думаю о реализации Objectify DAO с внедрением зависимостей, чтобы я мог поддерживать свой код для доступа к тому же «Dao», в то время как реализация может измениться с Objectify на Hibernate-MySQL или MongoDb в будущем, не беспокоясь об изменении любой код в пользовательском интерфейсе или на стороне клиента.

UserDao основан на следующем примере: http://turbomanage.wordpress.com/2010/01/28/simplify-with-objectify/

UserObjectifyDaoImpl implements Dao<User> {

 private UserDao dao = null; 

 public void put(User entity) {
    if (dao == null) {
       dao = new UserDao(); 
    }
    dao.put(entity);
 }
 // other put and set methods
}

Так, что у меня есть context.xml:

<bean id="userDao" class="com.example.server.daoimpl.UserObjectifyDaoImpl">
    <property name="dataSource" ref="dataSource"/>
</bean>

И если мне нужно изменить реализацию, мне просто нужно изменить этот компонент с UserObjectifyDaoImpl на что-то вроде:

UserHibernateDaoImpl или UserMongoDBDaoImpl или любая другая реализация, сохраняемая в любой базе данных.

И все же мой код в пользовательском интерфейсе / клиенте остается неизменным, например:

WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(getServletContext());

Dao dao = (Dao) ctx.getBean("userDao");
dao.put(something);

Одна из причин, по которой мне нужно сделать это прямо сейчас, - мне нужно разрабатывать с использованием движка приложений (через objectify), однако в будущем мне может понадобиться изменить некоторые объекты доступа к данным на hibernate, а некоторые на mongodb (так что это микс) ,

Я не тестировал этот код, будет ли работать эта стратегия?

Ответы [ 2 ]

1 голос
/ 09 февраля 2012

Да, это будет работать.Фактически это одна из основных причин, по которой были изобретены DI и кодирование интерфейса.Просто убедитесь, что все реализации DAO следуют одному и тому же контракту (DAO очень часто вводят неплотные абстракции ).

Также у вас есть несколько других вариантов для достижения той же цели:

  • Несколько @Service аннотированных классов, один из которых помечен как @Primary (если вы используете автоматическое подключение)

  • Пружинные профили и выборочная активацияbean

Кстати, если вы планируете перейти на другую реализацию DAO, взгляните на CrudRepository из Spring Data .Проект Spring Data предоставляет несколько модулей, которые реализуют этот интерфейс для MongoDB, Neo4J, JPA и т. Д.

В настоящее время кажется, что несколько модулей Spring Data не работают вместе (см .: DATAJPA-146), поэтому, если вы решите внедрить CrudRepository, убедитесь, что эта проблема исправлена, или вы можете обойти ее.Спасибо @ iddqd за указание на это.

0 голосов
/ 09 февраля 2012

Вы можете изменить контекстную конфигурацию для выбранной реализации Dao, если вам нужна только одна реализация в приложении, но если вам требуется более одной реализации в вашем приложении (режим смешивания), вам нужен дизайн Factory Layer . Вы пытаетесь спроектировать слой с именем Factory и его API и реализациями, и он решает, что Dao (Hibernate, MongoDB, JP или т. Д.) В любой момент должен выбрать.

...