jsf – Java EE 6和CDI
我刚刚开始学习CDI和
Java EE 6,但是我发现我想要完全理解的这段代码.
@Stateful @Model public class MemberRegistration { @Inject private EntityManager em; @Inject private Event<Member> memberEventSrc; private Member newMember; @Produces @Named public Member getNewMember() { return newMember; } } 然后…我看到一个jsf页面引用了这个newMember对象,如下所示: <h:inputText value=#{newMember.name}/> 所以我的问题是:如果我在任何对象的变量中放置一个@Named注释,那么JSF代码是否可以访问? 解决方法
尽管它的简单性,这个bean确实做了很多事情;)
需要使用@Named(CDI)或@ManagedBean(JSF-native)注释来创建JSF已知的bean.然而,Java EE具有定型观念,它是一种组合许多其他注释的复合注释. 在这种情况下,@Model是这样一种刻板印象,它结合了@Named和@RequestScoped. @Produces注释工厂方法;知道从哪里获取一些类型的实例的方法.它可以与所谓的限定符注释组合,例如@Foo,之后可以使用该注释来注入某些bean.然而,它与@Named结合使用,从而使newMember可用于JSF.而不是像例子那样创建bean.首先遇到一个@RequestScoped bean,当JSF想要一个实例时,将覆盖getNewMember()方法.有关更多信息,请参阅Dependency Injection in Java EE 6. @Stateful通常不优于@Stateless,当独立使用时. @Stateless bean被合并,并为客户端(通常在事务上下文中)执行一个方法.他们的有状态对象不是汇集的,没有CDI,调用者必须跟踪其生命周期(最终调用@Remove注释方法).在这里,bean也被分配了一个范围(请求,通过@Model),所以容器会照顾这个. 在这里使用此注释的可能原因可能是使bean的方法事务性.虽然给定的片段没有显示其使用,我猜这个类的一个版本有更多的方法使用EntityManager.交易将在那里发挥作用. (注意,以这种方式组合注释给Java EE开发人员提供了很多的权力,但是它在一个bean中提出了一些问题,这与一个bean应该做一件事情做得很好的说法相反,另一种是@Model注释仅关注视图问题的bean,它注入了封装业务逻辑而不是EntityManager的@Stateless bean.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |