我有原型(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/