我看到两个班级:
/ ** *此类使用CDI将Java EE资源(例如持久性上下文)别名到CDI bean * * /
public class Resources {
@Produces
@PersistenceContext
private EntityManager em;
@Produces
public Logger produceLog(InjectionPoint injectionPoint) {
return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName());
}
@Produces
@RequestScoped
public FacesContext produceFacesContext() {
return FacesContext.getCurrentInstance();
}
}
和
// The @Stateless annotation eliminates the need for manual transaction demarcation
@Stateless
public class MemberRegistration {
@Inject
private Logger log;
@Inject
private EntityManager em;
@Inject
private Event<Member> memberEventSrc;
public void register(Member member) throws Exception {
log.info("Registering " + member.getName());
em.persist(member);
memberEventSrc.fire(member);
}
}
我有两个问题:
1)会员注册可以注入&#34; log&#34;和&#34; em&#34;直接,那是因为资源已经使用@Produces注释定义了它们吗?没有Resources类,MemberRegistration类仍然可以工作吗?我试图了解这两个类是否或如何相关,以及CDI如何工作。
2)在MemberRegistration的注册方法中,只有一个&#34; em.persist()&#34;使用的方法。使用EntityManager的完整流程如下所示。在示例应用程序中,我没有看到方法&#34; commit()&#34;和&#34;关闭()&#34;使用。那么如何提交和关闭交易呢?
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
entityManager.persist( SomeObject );
entityManager.getTransaction().commit();
entityManager.close();
答案 0 :(得分:1)
回答你的问题:
1)
MemberRegistration
可以直接注入“log”和“em”,是因为资源已经使用@Produces注释定义了它们吗?
是。 @Inject仅适用于CDI已知的类型(通过类路径扫描发现或通过@Produces
手动声明)。因此,如果没有将Resources
和EntityManager
定义为CDI托管bean的Logger
类,则通过@Inject注入将无效。
顺便说一句。有关详细信息,请阅读cdi-spec-1.2 - PDF版本长170页,不是那么大,但也不会那么短。
2)那么交易如何提交和关闭?
...您的代码中甚至有一个有效的注释: @Stateless
注释消除了手动事务划分的需要。有关详细信息,请阅读EJB中的CMT事务。
老实说,我同意@JBNizet。看到你提出这样的问题(尤其是第一个问题)是令人失望的,只需快速测试即可立即回答。