3

Spring 3.2 を使用していDispatcherServletます。初期化が完了したに発生する初期化フックを探しています。DispatcherServlet標準の Spring ソリューションまたはサーブレット ソリューションのいずれかです。助言がありますか?

参考までに、サーブレット起動後の最終ログ ステートメントを次に示します。configured successfully ログステートメントの直後に初期化メソッドを実行したい。

DEBUG o.s.w.s.DispatcherServlet - Published WebApplicationContext of servlet 'mySpringDispatcherServlet' as ServletContext attribute with name [org.springframework.web.servlet.FrameworkServlet.CONTEXT.mySpringDispatcherServlet] 
INFO  o.s.w.s.DispatcherServlet - FrameworkServlet 'mySpringDispatcherServlet': initialization completed in 5000 ms   
DEBUG o.s.w.s.DispatcherServlet - Servlet 'mySpringDispatcherServlet' configured successfully 

私の調査によると、これまでのところ、次のものは望ましい効果がありませんでした。

  1. この回答ごとに拡張ContextLoaderListener/実装しています。ServletContextListener
  2. javaocWebApplicationInitializerごとに実装します。
  3. 私の豆は@PostConstruct正常に使用されます。コンテナがBeanを初期化して後処理した後に本質的に実行されるサーブレットまたはコンテナレベルのフックを探しています。
4

4 に答える 4

2

final根本的な問題は、メソッドをオーバーライドできなかったことHttpsServlet.init()です。Bean とコンテキストが完全に初期化されていることを確認する、近くの@Override-able メソッドを見つけました。DispatcherServlet.initWebApplicationContext

@オーバーライド
保護された WebApplicationContext initWebApplicationContext()
{
    WebApplicationContext wac = super.initWebApplicationContext();

    // 以下を介して、初期化された Foo Bean を処理します。
    // wac.getBean(Foo.class);

    結果を返します。
}
于 2013-06-19T20:38:38.403 に答える
1

Spring のStandard および Custom Eventsから。

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

@Component
public class ApplicationContextListener implements
                                     ApplicationListener<ContextRefreshedEvent> {

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        System.out.println("ApplicationContext was initialized or refreshed: "
                               + event.getApplicationContext().getDisplayName());
    }

}

上記のイベントは、出力時など、DispatcherServlet が初期化されるときに発生します。

INFO  org.springframework.web.servlet.DispatcherServlet - FrameworkServlet 'ServletName': initialization completed in 1234 ms
于 2014-04-02T19:31:51.040 に答える
0

ApplicationListener<ContextStartedEvent>アプリケーション コンテキスト内で実装できます。このイベント リスナーは、ルート コンテキストに対して 1 回、サーブレット コンテキストごとに 1 回呼び出されます。

public class StartupListener implements ApplicationListener<ContextStartedEvent> {

    public void onApplicationEvent(ContextStartedEvent event) {
        ApplicationContext context = (ApplicationContext) event.getSource();
        System.out.println("Context '" + context.getDisplayName() + "' started.");
    }

}

このリスナーをサーブレット コンテキスト内で定義する場合は、サーブレット コンテキスト自体に対して 1 回だけ呼び出す必要があります。

于 2013-06-19T16:27:51.583 に答える