spring 中ApplicationContextInitializer使用

ApplicationContextInitializer是Spring框架原有的東西,這個類的主要作用就是在ConfigurableApplicationContext類型(或者子類型)的ApplicationContext做refresh之前,允許我們對ConfiurableApplicationContext的實例做進一步的設置和處理。

ApplicationContextInitializer接口是在spring容器刷新之前執行的一個回調函數。是在ConfigurableApplicationContext#refresh() 之前調用(當spring框架內部執行 ConfigurableApplicationContext#refresh() 方法的時候或者在SpringBoot的run()執行時),作用是初始化Spring ConfigurableApplicationContext的回調接口。

ApplicationContextInitializer是Spring框架原有的概念, 這個類的主要目的就是在ConfigurableApplicationContext類型(或者子類型)的ApplicationContext做refresh之前,允許我們對ConfigurableApplicationContext的實例做進一步的設置或者處理。

通常用於需要對應用程序上下文進行編程初始化的web應用程序中。例如,根據上下文環境註冊屬性源或激活概要文件。

  • 參考ContextLoader和FrameworkServlet中支持定義contextInitializerClasses作爲context-param或定義init-param。
  • ApplicationContextInitializer支持Order註解,表示執行順序,越小越早執行

 

自定義ApplicationContextInitializer實現由三種方法:

先新建一個類實現ApplicationContextInitializer,如下:

package com.wm.contextinit.context;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.annotation.Order;

import java.util.Arrays;

/***
 * @ClassName: MyApplicationContextInitializer
 * @Description: ApplicationContextInitializer是一個回調接口,它會在ConfigurableApplicationContext的refresh()方法調用之前被調用,做一些容器的初始化工作。
 * @Author: wm_yu
 * @Create_time: 14:01 2019-11-27
 */
@Order(1)
@Slf4j
public class MyApplicationContextInitializer implements ApplicationContextInitializer {

    @Override
    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {

        log.info("MyApplicationContextInitializer.......");

        // 打印容器裏面有多少個bean
        System.out.println("bean count:" + configurableApplicationContext.getBeanDefinitionCount());

        log.info("bean count:[{}]", configurableApplicationContext.getBeanDefinitionCount());

        String[] beanDefinitionNames = configurableApplicationContext.getBeanDefinitionNames();

        log.info("bean names:[{}]", Arrays.toString(beanDefinitionNames));


    }
}

方法一:

 在application中配置:

 

context:
  initializer:
    classes: com.wm.contextinit.context.MyApplicationContextInitializer

 

啓動main,如下:

 

可以看到這個自定義的是最先加載的

 

方法二:

在main方法中編碼方式啓動:

package com.wm.contextinit;

import com.wm.contextinit.context.MyApplicationContextInitializer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ContextinitApplication {

    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(ContextinitApplication.class);
        //加入自定義的啓動參數
        application.addInitializers(new MyApplicationContextInitializer());
        application.run(args);
    }

}

 

啓動如下:

結果一樣的

 

方式三:

使用SpringBoot的SPI擴展---META-INF/spring.factories中配置

在META-INF下新建spring.factories文件

org.springframework.context.ApplicationContextInitializer=com.wm.contextinit.context.MyApplicationContextInitializer

 

 

啓動結果:

以上就是三種配置方式

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章