スコープのSpringイベントの可能性?

ステファンHarbich:

春のイベントメカニズムをサポートするアプリケーションのイベントを公開し、経由春のコンポーネント内のこれらのイベントに耳を傾け@EventListenerた注釈。しかし、私は、内の特定の範囲内のイベントを送信については何も見つけることができません文書をVaadinのための私の具体的なニーズは、次のとおりです。

  • ユーザーとの対話のコンテキストで、イベントを送信する(例えば、ログインしている場合)
  • このイベントは、同じで豆によって消費されなければならない@UIScope影響すべきではない、すなわち、他のユーザーのUI

それは可能ですか?注:これは本当にVaadinに固有ではありません。私はまた、春のWeb MVC要求の範囲で行われるだろうか求めることができます。

ジェレミー・グランド:

TL; DR:私はあなたがそれを望んでいたとして、それはすでにうまくいくと思います

ロングバージョン:

ドキュメントには、このことについて、やや不明瞭であるが、簡単なテストを試してみました:

イベントを発行しコントローラ:

@Controller
public class FooController {
    @Autowired
    private ApplicationEventPublisher publisher;

    @GetMapping("/fireEvent")
    public void fireEvent() {
        publisher.publishEvent(new FooEvent(this));
    }
}

そして、スコープのBeanに待機します:

@Scope(value = WebApplicationContext.SCOPE_REQUEST)
@Component
public class FooListener {
    @EventListener(FooEvent.class)
    public void listen() {
         System.out.println("I'm listening. PS : I am "+this.toString());
    }
}

2つの同時リクエストを実行している場合や、唯一のリスナーが同じHttpRequestのイベントを取得するスコープ。


私の解釈(本当に深くそれを見なくても、その塩の粒とそれを取ります):

ように私には思えるApplicationEventMulticasterのは、ListenerRetriever以前に(自分の名前で)リスナーとして登録された豆を取得するたBeanFactoryを使用しています。そして、明らかに、工場は現在のスコープでBeanを返します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=176210&siteId=1