2013-12-14 18 views
7

Tôi đang cố gắng xây dựng ứng dụng chỉ bằng cách sử dụng mô-đun JPA, CDI (OpenWebBeans + Deltaspike JPA), JSF. Tôi đang sử dụng CDI được triển khai trên Tomcat theo cách tương tự mà tôi đang sử dụng để sử dụng khung công tác Spring. Tôi có DAO gọi GenericDAOImpl như thế này (lần đầu tiên vài dòng):Phạm vi CDI nào nên được sử dụng cho các lớp DAO và Dịch vụ

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; 

Các EntityManager được tiêm sử dụng DeltaSpike JPA modulehttp: //deltaspike.apache.org/jpa.html. GenericDao này sau đó được thừa hưởng bởi DAO cụ thể (UserDao vv ..) được sử dụng bởi các lớp dịch vụ.

Ví dụ 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."); 
     } 
    } 
} 

Sử dụng CDI cách này cả DAO và lớp dịch vụ sẽ có phạm vi phụ thuộc không giống như trong mùa xuân, nơi họ sẽ singleton. Vì vậy, mỗi khách hàng sẽ có một cá thể mới được tiêm. Tôi có nên thay đổi phạm vi trên các lớp DAO và Dịch vụ thành ApplicationScope không? Nhưng sau đó bởi các đặc điểm kỹ thuật tôi phải làm cho tất cả các lớp học đang được tiêm serializable. Trong trường hợp các lớp học Dao này có thể là một vấn đề, EntityManager nên được đánh dấu là thoáng qua? A

Tôi rất vui vì mọi đề xuất.

Trả lời

5

@ApplicationScoped không liên quan đến Serializable, chúng luôn ở xung quanh và không bao giờ tồn tại trong đĩa. @SessionScoped sẽ yêu cầu tuần tự hóa do hành vi của các đối tượng phiên HTTP.

Tôi khuyên bạn nên sử dụng phạm vi như để mọi thứ phụ thuộc sẽ dẫn đến rò rỉ bộ nhớ (không bao giờ rõ ràng khi đối tượng @Dependent bị xóa). Nếu đơn đăng ký của bạn khá phi trạng thái, bạn có thể sử dụng @RequestScoped. @ApplicationScoped bạn cần phải xem xét rằng nhiều khách hàng sẽ kết nối với cá thể của bạn.

+1

Cảm ơn câu trả lời của bạn. Trong trường hợp tôi sử dụng @ApplicationScoped, tôi hy vọng rằng như trong Spring bean (singleton scoped in spring) sẽ được truy cập nhiều lần đồng thời. Do đó sẽ không có bất kỳ vấn đề hiệu suất nào. Chỉ quan tâm từ phần của tôi là làm cho chủ đề lớp an toàn. Hoặc đồng thời không được xử lý tự động bởi thùng chứa CDI? –

+1

Đồng thời không được xử lý bởi vùng chứa CDI. –

Các vấn đề liên quan