java-ee – 应该为DAO和Service类使用哪个CDI范围
发布时间:2020-12-15 00:51:05 所属栏目:Java 来源:网络整理
导读:我正在尝试使用JPA,CDI(OpenWebBeans Deltaspike JPA模块),JSF构建应用程序.我使用部署在Tomcat上的CDI的方式与我习惯使用 Spring框架的方式相同.我有这样的DAO叫GenericDAOImpl(前几行): public abstract class GenericDaoJpaT implements GenericDaoT { p
我正在尝试使用JPA,CDI(OpenWebBeans Deltaspike JPA模块),JSF构建应用程序.我使用部署在Tomcat上的CDI的方式与我习惯使用
Spring框架的方式相同.我有这样的DAO叫GenericDAOImpl(前几行):
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 JPA modulehttp://deltaspike.apache.org/jpa.html注入EntityManager.这个GenericDao然后由服务类使用的具体DAO(UserDao等…)继承. 例如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 DAO和Service类都将具有Dependent范围,而不像spring那样它们将是singleton.因此,每个客户端都会注入新实例. 我很乐意提出任何建议. 解决方法
@ApplicationScoped与Serializable无关,它们总是存在,永远不会持久存在于磁盘上.由于HTTP会话对象的行为,@ SessionConcped将需要序列化.
我建议使用一个范围,因为所有依赖都会导致内存泄漏(当删除@Dependent对象时,它永远不会清楚).如果您的应用程序相当无状态,则可以使用@RequestScoped. @ApplicationScoped您需要考虑多个客户端将连接到您的实例. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容