我有原型(prototype) 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 中吗?在这种情况下它有影响吗?

最佳答案

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

当请求开始时,将创建成员列表,它包含创建此请求作用域 bean 之前的所有成员。稍后,您保留一个新成员,因此需要更新此列表以呈现响应。

当您说列表是为每个请求构建时,您的想法是正确的,但这发生在开始时。添加成员后,您需要刷新它,不是吗?
如果此方法不存在,则响应将过时(您将在保留新成员之前呈现您拥有的列表),并且您将需要一个额外的帖子或获取新成员列表。
@Observes 像观察者模式一样将监听器和事件源解耦。因此,如果 @Observes 不存在,您需要将新成员显式添加到列表中,以便响应正确。

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

关于JavaEE 和 CDI : Understanding @Observes,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6658653/

10-10 22:28