私は Web アプリケーションを構築しており、Guice Servlet 拡張機能を使用してすべてをブートストラップしています。
私が見つけたユーザーガイドと例に従って、 myweb.xml
には を拡張する単一のリスナーがありますGuiceServletContextListener
。リスナーで、ここで説明されているようにインジェクターを作成します。
私のアプリには、サーブレットコンテキストがそれぞれ初期化および破棄されるときに、初期化および破棄する必要があるいくつかのコンポーネントがあります。例としては、キャッシュ マネージャー、サードパーティ API からデータを取得するクライアント、Cassandra ストアにアクセスするクライアントなどがあります。
これらのコンポーネントを初期化/破棄する適切な場所を見つけようとしています。Guice がなければ、おそらくコンテキスト リスナーで直接それを行うでしょうが、Guice はそれを促進しないようです。
私が見たのは、サービスごとにサーブレット フィルターを使用していることです。各フィルターに init/destroy を実装することで、各サービスを開始および停止できます。ただし、実際にフィルタリングする必要がない場合、サーブレットのライフサイクルにフックするだけではやり過ぎのように思えます。
@Singleton
public final class MyServiceFilter implements Filter {
private final MyService service;
@Inject
public MyServiceFilter(MyService service) {
this.service = service;
}
@Override
public void init(FilterConfig filterConfig) {
service.start();
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
chain.doFilter(request, response);
}
@Override
public void destroy() {
service.stop();
}
}
他のオプションはありますか?