jsf – Java EE 6和CDI

前端之家收集整理的这篇文章主要介绍了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代码是否可以访问?
此外,在这种情况下,@Produces的用法是什么,最后在Java EE 6中@Stateful优先于@Stateless?如果是这样的话呢?

解决方法

尽管它的简单性,这个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.)

猜你在找的Java相关文章