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.
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? –
Đồng thời không được xử lý bởi vùng chứa CDI. –