Pab*_*blo 9 jsf java-ee cdi java-ee-6 jsf-2
我刚刚开始学习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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后......我看到一个jsf页面newMember像这样引用了这个对象:
<h:inputText value=#{newMember.name}/>
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:如果我@Named在任何对象的变量中放置一个注释并不重要,无论如何它都可以从JSF代码访问?此外,有什么的使用@Produces在这种情况下,最后被@Stateful优先于@StatelessJava EE 6中?如果是这样的话?
Arj*_*jms 19
尽管它很简单,但这个bean确实做了很多事情;)
无论是@Named(CDI)或@ManagedBean(JSF天然)注释需要使已知JSF的bean.但是,Java EE的概念stereotypes是一种复合注释,它结合了许多其他注释.
在这种情况下@Model是这样的刻板印象,它结合@Named和@RequestScoped.
@Produces注释工厂方法; 一种知道从哪里获取某种类型实例的方法.它可以与所谓的限定符注释结合使用,例如@Foo,之后您可以使用该注释在某些bean中注入某些内容.但是在这种情况下@Named,它newMember与JSF 结合使用.例如,当@RequestScoped首先遇到bean时,不会创建bean,而是getNewMember()在JSF想要实例时调用该方法.有关详细信息,请参阅Java EE 6中的依赖注入.
@Stateful通常@Stateless不比单独使用时更受欢迎.@Statelessbean被合并并为客户端执行一种方法(通常在事务上下文中).他们的有状态对应物没有合并,没有CDI,调用者必须跟踪其生命周期(通过最终调用带@Remove注释的方法).这里,bean也被分配了一个范围(request,via @Model),因此容器将负责处理.
在这里使用此注释的可能原因可能是使bean的方法具有事务性.虽然给出的片段没有显示它的用法,但我猜这个类的版本有更多的方法可以使用EntityManager.交易将在那里发挥作用.
(注意,以这种方式组合注释为Java EE开发人员提供了很多功能,但它确实在一个bean中引入了一些问题,这与bean应该做一件事并做得好的咒语相反.另一种选择是@Model注释bean聚焦仅在视图关注点上,注入了@Stateless封装业务逻辑而非封装的bean EntityManager.)
| 归档时间: |
|
| 查看次数: |
3258 次 |
| 最近记录: |