Должны ли DAO с инъекцией Guice быть синглтонами?

В настоящее время я работаю над приложением, использующим Guice/JPA/Hibernate для получения информации из моей базы данных.

Я прочитал документацию Guice по работе с JPA и EntityManagars здесь: http://code.google.com/p/google-guice/wiki/JPA,

Но у меня проблемы с пониманием того, когда я должен сделать свои реализации DAO синглтонами.

Я читал этот вопрос на S/O относительно использования Spring в DAO, где говорится:

Создание экземпляра DAO для каждого запроса было бы безумием.

Переносится ли это для контейнеров DI, отличных от Spring? Если я внедряю поставщика DAO в свой сервлет и вызываю его при необходимости, должна ли реализация службы DAO быть синглтоном?

Вот схема одного из моих DAO:

public DAOImpl implements DAOService { <-- SHOULD THIS BE ANNOTATED @Singleton?

    @Inject
    private EntityManager em;
    // OR 
    // @Inject 
    // private Provider emProvider - If it's a singleton.

    @Inject
    DAOImpl(OtherServices os) {
        this.otherServices = os;
    }

    @Transactional
    public MyPersistedObject getPersistedObject(long id) {
        MyPersistedObject mpo = em.find(MyPersistedObject.class, id);
        return mpo;
    }
}

И как он называется:

   @Singleton
   public MyServlet(HttpRequest req, HttpRequest res) 
           extends ServletInterfaceOfTheDay {

       private final daoService; // If Singleton
       // OR
       // private final Provider; If Instanced DAO

       @Inject
       MyServlet(DAOService dao) {
           this.daoService = dao;
       }

       // Gather Information from request here...

       MyPersistedObject mpo = daoService.getPersistedObject(requestIdInfo);
       // OR daoService.get().getPersistedObject(requestIdInfo);

       // Process Response Info here....

   }

Спасибо за помощь.

5
задан Community 23 May 2017 в 12:21
поделиться