Какова цель отделения классов DAO от классов, которые фактически создаются приложением? - PullRequest
0 голосов
/ 15 апреля 2011

В чем преимущество того, что классы DAO отличаются от классов, которые фактически создаются в коде приложения, то есть почему бы просто не создать экземпляр класса dao прямо в сценарии, подобном следующему:

Class CreateIocContainer{
    p s v main(String[] args){
        new IocContainer("springMetadataFile.xml");
    }
}

Class ClassThatInstantiatesServicesViaSpringBean{
    Services services;
    // bean setter for services class
    setServices(Services services){
        this.services = services
    }
}

Class ServicesImpl implements Services
    ServicesDao servicesDao;

    String getSomethingFromDB(String argumentForQuery){
        return servicesDao.getSomethingFromDB(argumentForQuery);
    }
}

Class ServicesDaoImpl implements ServicesDao{

    String getSomethingFromDb(String argumentForQuery){
        //code to return something from db
        return queryResultString;
    }
}

Кроме того, будеткласс, который я назвал Class ClassThatInstantiatesServicesViaSpringBean является фабричным классом и обычно называется Class XFactory ?

1 Ответ

2 голосов
/ 15 апреля 2011

Ваши DAO всегда являются интерфейсами, они никогда не являются классом. Этот DAO - в основном шаблон проектирования. Такое разделение DAO и его реализация дает хороший метод для разделения механизма сохранения объектов и логики доступа к данным.

Сегодня в XML-файле bean, который вы упомянули,

  <bean name="ServiveDao" class="com.example.ServiceImplHibnernate">
     <property name="sessionFactory" ref="sessionFactory"/>
  </bean>

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

   class ServiceImplIBAtis implements ServiceDao {..}

и измените xml-файл для загрузки вашей реализации

  <bean name="ServiveDao" class="com.mycompany.ServiceImplIBAtis">
     <property name="sessionFactory" ref="sessionFactory"/>
  </bean>

Везде, где есть ссылка на компонент ServiceDao, пружина внедряет экземпляр ServiceImplIBAtis вместо ServiceImplHibnernate. Теперь вашему приложению не нужно знать, что меняется в фоновом режиме. Все, что ему нужно знать, - это дао, называемое Service, и методы, которые можно использовать для доступа к данным.

...