【问题标题】:JavaEE and CDI: Understanding @ObservesJavaEE 和 CDI:了解 @Observes
【发布时间】:2011-07-12 01:41:06
【问题描述】:

我有org.jboss.weld.archetypes:jboss-javaee6-webapp:1.0.1.CR2 的原型,我尝试理解MemberListProducer 的类:

@RequestScoped
public class MemberListProducer
{
  @Inject @MemberRepository private EntityManager em;

  private List<Member> members;
  @Produces @Named public List<Member> getMembers() {return members;}

  public void onMemberListChanged(@Observes(notifyObserver = Reception.IF_EXISTS)
                                  final Member member){
    retrieveAllMembersOrderedByName();
  }

  @PostConstruct
  public void retrieveAllMembersOrderedByName()
  {
    //Criteria Query to fetch all members
    members = em.createQuery(criteria).getResultList();
  }
}

观察者是用memberEventSrc.fire(newMember); 从另一个类调用的,这似乎很清楚:一旦被触发,MemberListProducer 就会更新成员列表。

但我不明白为什么这是在 @RequestScoped Bean 中完成的。据我了解,方法retrieveAllMembersOrderedByName 无论如何都会被每个请求调用。这个@Observes 不应该更好地放在@ViewScoped@SessionScoped Bean 中吗?在这种情况下它是否有影响?

【问题讨论】:

    标签: java java-ee-6 cdi jboss-weld


    【解决方案1】:

    @Observes 的使用更多的是一个示例,而不是一个真实的实际用例。在您做出回复之前,请考虑成员更改的可能性。 我认为如果您将其删除,该网站将无法正常工作。这样想:

    当请求开始时,会创建成员列表,其中包含在创建此请求范围 bean 之前的所有成员。稍后,您持久化了一个新成员,因此需要更新此列表以呈现响应。

    当您说列表是为每个请求构建的时,您的想法是正确的,但是这发生在开头。添加成员后,您需要刷新它,不是吗? 如果没有此方法,则响应将过时(您将呈现您在持久化新成员之前拥有的列表),并且您将需要一个额外的帖子或获取新的成员列表。

    @Observes 将侦听器和事件源解耦,就像观察者模式一样。因此,如果@Observes 不存在,您需要将新成员显式添加到列表中,以便响应正确。

    希望我正确理解了您的问题。

    【讨论】:

    • 请记住,就像我说的那样,这个例子是理论上的,可以优化。您通常不会将所有成员都保存在内存中,如果您这样做,则可能是 @applicationscoped 或 Singleton 等。我相信您已经知道了,呵呵。
    【解决方案2】:

    它是请求范围的,因为它存储每个请求的成员列表。如果您需要按会话存储此列表,请更改它。

    但它看起来不对 - 您正在丢弃观察者方法的 member 参数。

    【讨论】:

    • 其实我并不需要它(而且它不是我的sn-p,它来自原型示例)。我只是想了解它。如果每个请求都创建成员列表,那么onMemberListChanged方法的原因是什么?
    • 嗯,理论上可以在一个请求中注册多个成员。
    • 理论上,但在此示例中,bean 接缝只是访问成员列表的门面,onMemberListChanged 在我看来没有任何效果。
    • >>...但是在这个例子中,豆子 seams...>seams
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 2013-10-08
    • 2016-11-21
    相关资源
    最近更新 更多