2013-12-14 11 views
7

DAO ve Servis sınıfları için kullanılması gereken hangi CDI kapsamı. Ben Tomcat üzerinde konuşlandırılan CDI kullanıyorum aynı şekilde Spring framework kullanmak için kullanıyorum. EntityManager DeltaSpike JPA modulehttp kullanılarak enjekte edilirSadece JPA, CDI (OpenWebBeans + Deltaspike JPA modülü), JSF kullanarak uygulamayı kurmaya çalışıyorum

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; 

: //deltaspike.apache.org/jpa.html Ben DAO böyle GenericDAOImpl (ilk birkaç satır) olarak adlandırılan var. Bu GenericDao daha sonra servis sınıfları tarafından kullanılan beton DAO (UserDao vb.) Tarafından devralınır. örnek UserServiceImpl için

:

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."); 
     } 
    } 
} 

onlar tekil olacağını ilkbaharda aksine Bağımlı kapsamını olacak CDI bu şekilde DAO ve Servis sınıf hem kullanma. Bu nedenle her müşterinin yeni örneği enjekte edilecektir. DAO ve Servis sınıflarındaki kapsamları ApplicationScope'a değiştirmeliyim? Ama sonra şartname ile seri hale getirilebilir enjekte edilen tüm sınıfları yapmak zorundayım. Dao sınıfları durumunda bu bir sorun olabilir, EntityManager daha sonra geçici olarak işaretlenmelidir? Bir

Ben herhangi bir önerileri için sevinirim.

cevap

5

@ApplicationScoped onlar etrafında her zaman konum ve diske devam asla Serializable için hiçbir önemi vardır. @SessionScoped, HTTP oturum nesnelerinin davranışından dolayı serileştirme gerektirecektir.

Her şeyi bağımlı bırakarak bellek sızıntılarına neden olacağı şekilde bir kapsam kullanmanızı öneririm (@Dependent nesnesinin kaldırılmasından sonra hiçbir zaman açık değildir). Uygulamanız oldukça durumsuzsa, @RequestScoped'u kullanabilirsiniz. @ApplicationScoped birden fazla istemcinin örneğinize bağlanacağını düşünmeniz gerekir. Cevabınız için

+1

teşekkürler. @ApplicationScoped'i kullanmam durumunda, ilkbaharda olduğu gibi fasulyede (ilkbaharda kapsamlanan tekil) aynı anda birçok kez erişilmesini beklerdim. Bu nedenle herhangi bir performans problemi olmayacaktı. Sadece benim parçamdan kaygılanmak, sınıf ipliklerini güvenli hale getirmek olurdu. Veya eşzamanlılık CDI konteyner tarafından otomatik olarak ele değil mi? –

+1

Eşzamanlılık CDI kabı tarafından ele alınmaz. –