當spring 容器初始化完成後執行某個方法

在作web項目開發中,尤爲是企業級應用開發的時候,每每會在工程啓動的時候作許多的前置檢查。java

  好比檢查是否使用了咱們組禁止使用的Mysql的group_concat函數,若是使用了項目就不能啓動,並指出哪一個文件的xml文件使用了這個函數。web

而在Spring的web項目中,咱們能夠介入Spring的啓動過程。咱們但願在Spring容器將全部的Bean都初始化完成以後,作一些操做,這個時候咱們就能夠實現一個接口:spring

package com.yk.test.executor.processor
public class InstantiationTracingBeanPostProcessor implements ApplicationListener<ContextRefreshedEvent> {
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
      //須要執行的邏輯代碼,當spring容器初始化完成後就會執行該方法。
 }
}

同時在Spring的配置文件中,添加註入:sql

<bean class="com.yk.test.executor.processor.InstantiationTracingBeanPostProcessor"/>

 

可是這個時候,會存在一個問題,在web 項目中(spring mvc),系統會存在兩個容器,一個是root application context ,另外一個就是咱們本身的 projectName-servlet  context(做爲root application context的子容器)。mvc

這種狀況下,就會形成onApplicationEvent方法被執行兩次。爲了不上面提到的問題,咱們能夠只在root application context初始化完成後調用邏輯代碼,其餘的容器的初始化完成,則不作任何處理,修改後代碼app

以下:ide

 

@Override
  public void onApplicationEvent(ContextRefreshedEvent event) {
      if(event.getApplicationContext().getParent() == null){//root application context 沒有parent,他就是老大.
           //須要執行的邏輯代碼,當spring容器初始化完成後就會執行該方法。
      }
  }
相關文章
相關標籤/搜索