2011-07-12 8 views
2

私は原型org.jboss.weld.archetypes:jboss-javaee6-webapp:1.0.1.CR2を持っていると私はクラスMemberListProducerを理解しよう:たJavaEEとCDI:理解@Observes

@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に配置しないとよいでしょうか?この場合でも効果はありますか?

答えて

3

@Observesを使用すると、実用的な使用例よりも多くの例があります。あなたがあなたの反応を表現する前に、メンバーが変わる可能性を考慮してください。 ウェブサイトを削除しても正しく動作しないと思います。

リクエストが開始されると、メンバーのリストが作成され、このリクエストスコープ付きBeanの作成までのすべてのメンバーが含まれます。その後、新しいメンバーを永続させるので、このリストを更新してレスポンスをレンダリングする必要があります。

リストがリクエストごとに作成されているとは思えますが、これは最初に発生します。メンバーを追加した後、更新する必要がありますか? このメソッドが存在しない場合、レスポンスは古くなります(新しいメンバーを永続化する前のリストをレンダリングします)。追加のポストが1つ必要な場合や、新しいメンバーのリストを取得する場合があります。

@Observesは、オブザーバーパターンとよく似たリスナーとイベントソースを切り離します。したがって、@Observesが存在しない場合は、レスポンスが正しいように新しいメンバーをリストに明示的に追加する必要があります。

私はあなたの質問を正しく理解したと思います。

+0

私はこの例は理論的であり、最適化できると言ったように心に留めておく。あなたは通常、すべてのメンバーをメモリに保持しません。そうすれば、おそらく@applicationscopedまたはSingletonなどです。私はあなたがすでにそのheheを知っていると確信しています。 – arg20

0

リクエストごとにメンバーのリストが格納されているため、リクエストが有効です。このリストをセッションごとに格納する必要がある場合は、それを変更します。

しかし、これは間違っています - あなたはオブザーバーメソッドのmember引数を破棄しています。

+0

実際、私はそれを必要としません(それは私のスニペットではなく、元の例です)。私はそれを理解したい。メンバーリストがリクエストごとに作成された場合、 'onMemberListChanged'メソッドの理由は何ですか? – Thor

+0

うまくいって、理論的には1つのリクエスト内に複数のメンバーを登録することができます。 – Bozho

+0

理論的には、この例では、メンバーのリストにアクセスするためのファサードだけの豆継ぎ目と 'onMemberListChanged'は私の意見では効果がありません。 – Thor