2013-12-14 4 views
7

Ich versuche, Anwendung nur mit JPA, CDI (OpenWebBeans + Deltaspike JPA-Modul), JSF zu erstellen. Ich verwende CDI, das auf Tomcat bereitgestellt wird, auf die gleiche Weise, mit der ich das Spring-Framework verwende. Ich habe DAO GenericDAOImpl wie folgt aufgerufen (ersten Zeilen):Welcher CDI-Bereich sollte für DAO und Service-Klassen verwendet werden

public abstract class GenericDaoJpa<T> implements GenericDao<T> { 
    private static final Log logger = LogFactory.getLog(GenericDaoJpa.class); 

    @Inject 
    protected EntityManager entityManager; 

    private Class<T> type; 

Der EntityManager injiziert wird mit DeltaSpike JPA modulehttp: //deltaspike.apache.org/jpa.html. Dieses GenericDao wird dann von konkreten DAO (UserDao etc ..) übernommen, die von Serviceklassen verwendet werden.

Zum Beispiel UserServiceImpl:

public class UserServiceImpl implements UserService { 

    private static final Log logger = LogFactory.getLog(UserServiceImpl.class); 

    @Inject 
    private UserDao userDao; 

    @Transactional 
    public void saveUser(UserDto user) throws UserServiceException { 
     try { 
      User u = new User(user); 
      userDao.create(u); 
     } catch (Exception e) { 
      logger.error("Error while creating user.", e); 
      throw new UserServiceException("Error while creating user."); 
     } 
    } 
} 

CDI Mit dieser Art und Weise sowohl DAO und Service-Klasse wird im Gegensatz zu im Frühjahr Dependent Umfang hat, wo sie Singleton sein würden. Daher wird jedem Client eine neue Instanz hinzugefügt. Sollte ich Bereiche für DAO- und Service-Klassen zu ApplicationScope ändern? Aber dann muss ich bei der Spezifikation alle Klassen machen, die serialisiert werden sollen. Im Fall von Dao-Klassen könnte das ein Problem sein, EntityManager sollte dann als transient markiert werden? A

Ich würde mich für irgendwelche Empfehlungen freuen.

Antwort

5

@ApplicationScoped hat keine Relevanz für Serializable, sie sind immer in der Nähe und bleiben nie auf der Festplatte. @SessionScoped erfordert Serialisierung aufgrund des Verhaltens von HTTP-Sitzungsobjekten.

Ich würde empfehlen, einen Bereich zu verwenden, da das Verlassen von allem zu Speicherlecks führt (es wird nie klar, wenn ein @Dependent Objekt entfernt wird). Wenn Ihre Anwendung relativ zustandslos ist, können Sie @RequestScoped verwenden. @ApplicationScoped müssen Sie berücksichtigen, dass mehrere Clients eine Verbindung zu Ihrer Instanz herstellen.

+1

Danke für Ihre Antwort. Für den Fall, dass ich @ApplicationScoped verwende, würde ich erwarten, dass wie im Frühling auf die Bean (Singleton im Frühling) mehrmals gleichzeitig zugegriffen wird. Daher würde es keine Leistungsprobleme geben. Einzige Sorge von meiner Seite wäre es, die Klasse Thread sicher zu machen. Oder wird Nebenläufigkeit nicht automatisch vom CDI-Container behandelt? –

+1

Nebenläufigkeit wird nicht vom CDI-Container verarbeitet. –

Verwandte Themen