73

通常のサーブレットの場合、 context listenerを宣言できると思いますが、Spring MVC の場合、Spring はこれを簡単にしますか?

さらに、コンテキスト リスナーを定義してから、servlet.xmlまたはで定義された Bean にアクセスする必要がある場合applicationContext.xml、どのようにそれらにアクセスできますか?

4

5 に答える 5

109

Spring には、処理できる標準イベントがいくつかあります。

ApplicationListenerこれを行うには、次のようなインターフェイスを実装する Bean を作成して登録する必要があります。

package test.pack.age;

import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;

public class ApplicationListenerBean implements ApplicationListener {

    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        if (event instanceof ContextRefreshedEvent) {
            ApplicationContext applicationContext = ((ContextRefreshedEvent) event).getApplicationContext();
            // now you can do applicationContext.getBean(...)
            // ...
        }
    }
}

次に、この Bean をservlet.xmlorapplicationContext.xmlファイルに登録します。

<bean id="eventListenerBean" class="test.pack.age.ApplicationListenerBean" />

Spring は、アプリケーション コンテキストが初期化されると通知します。

Spring 3 (このバージョンを使用している場合) では、ApplicationListenerクラスはジェネリックであり、関心のあるイベント タイプを宣言でき、それに応じてイベントがフィルター処理されます。次のように、Bean コードを少し単純化できます。

public class ApplicationListenerBean implements ApplicationListener<ContextRefreshedEvent> {

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        ApplicationContext applicationContext = event.getApplicationContext();
        // now you can do applicationContext.getBean(...)
        // ...
    }
}
于 2011-12-31T10:46:25.000 に答える
90

Spring 4.2以降、使用できます@EventListenerドキュメント

@Component
class MyClassWithEventListeners {

    @EventListener({ContextRefreshedEvent.class})
    void contextRefreshedEvent() {
        System.out.println("a context refreshed event happened");
    }
}
于 2015-10-27T14:08:58.070 に答える
1

複数のデータベースからのデータを含むHashMap(私のWebページで使用される)を作成するURLを入力する単一ページアプリケーションがありました。サーバーの起動時にすべてをロードするために、次のことを行いました-

1 - 作成された ContextListenerClass

public class MyAppContextListener implements ServletContextListener
    @Autowired

    private  MyDataProviderBean myDataProviderBean; 

    public MyDataProviderBean getMyDataProviderBean() {

        return MyDataProviderBean;

    }

    public void setMyDataProviderBean(MyDataProviderBean MyDataProviderBean) {

        this.myDataProviderBean = MyDataProviderBean;

    }

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {

        System.out.println("ServletContextListener destroyed");

    }


    @Override

    public void contextInitialized(ServletContextEvent context) {

        System.out.println("ServletContextListener started");

        ServletContext sc = context.getServletContext();

        WebApplicationContext springContext = WebApplicationContextUtils.getWebApplicationContext(sc);

        MyDataProviderBean MyDataProviderBean = (MyDataProviderBean)springContext.getBean("myDataProviderBean");

        Map<String, Object> myDataMap = MyDataProviderBean.getDataMap();

        sc.setAttribute("myMap", myDataMap);

    }

2- web.xml に以下のエントリを追加

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> 
<listener>
    <listener-class>com.context.listener.MyAppContextListener</listener-class>
</listener>

3-コントローラークラスで、最初にservletContextのMapをチェックするようにコードを更新しました

    @RequestMapping(value = "/index", method = RequestMethod.GET)
        public String index(@ModelAttribute("model") ModelMap model) {

            Map<String, Object> myDataMap = new HashMap<String, Object>();
            if (context != null && context.getAttribute("myMap")!=null)
            {

                myDataMap=(Map<String, Object>)context.getAttribute("myMap");
            }

            else
            {

                myDataMap = myDataProviderBean.getDataMap();
            }

            for (String key : myDataMap.keySet())
            {
                model.addAttribute(key, myDataMap.get(key));
            }
            return "myWebPage";

        }

Tomcat を起動すると、この多くの変更により、startTime 中に dataMap がロードされ、すべてが servletContext に配置されます。これは、コントローラー クラスによって使用され、既に設定されている servletContext から結果を取得します。

于 2016-04-20T11:03:05.573 に答える