Java EE 6 and CDI

9

我刚开始学习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?如果是这样,为什么?
1个回答

19

尽管这个Bean很简单,但它确实可以完成很多事情 ;)

@Named(CDI)或@ManagedBean(JSF-native)注释之一是必需的,才能使一个Bean被JSF识别。但是,Java EE有所谓的stereotypes概念,它是一种组合注释,结合了许多其他的注释。

在这种情况下,@Model就是一个这样的组合注释,它结合了@Named@RequestScoped

@Produces注释用于工厂方法;这是一种从某个类型中获取实例的方法。这个注释还可以与所谓的限定符注释结合使用,例如@Foo,然后你可以在某个Bean中使用该注释来进行注入。然而,在这种情况下,它与@Named结合使用,这使得newMember可用于JSF。与其它Bean不同,如遇到@RequestScoped Bean,会创建此Bean, 在内部,当JSF需要一个实例时,将调用getNewMember()方法。有关更多信息,请参见Java EE 6中的依赖注入

@Stateful通常不优于单独使用@Stateless。无状态Bean是被放入池中的,为客户端执行一个方法(通常在事务上下文中)。它们有状态的对应物是不会被池化的。如果没有CDI,调用方必须追踪它的生命周期(通过最终调用带有@Remove注释的方法)。这里,这个Bean也被分配了一个范围(@Model请求),所以容器将会照顾它。

使用这个注解的可能原因是为了使bean的方法具有事务性。虽然给出的代码片段没有展示它的使用,但我猜测这个类的另一个版本会有更多利用EntityManager的方法。事务将在那里发挥作用。
(注意,以这种方式组合注解可以给Java EE开发人员带来很大的权力,但它确实将几个关注点放在一个bean中,这与一个bean应该做好一件事情的信条相反。另一种替代方案是使用@Model注释的bean,只关注视图问题,并注入封装业务逻辑的@Stateless bean,而不是EntityManager。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接