ApplicationContextInitializer接口

ApplicationContextInitializer接口是在spring容器刷新之前執(zhí)行的一個(gè)回調(diào)函數(shù)。

發(fā)現(xiàn)這個(gè)接口是定義在org.springframework.context包下的??纯雌鋔avadoc:

Callback interface for initializing a Spring ConfigurableApplicationContext
prior to being ConfigurableApplicationContext#refresh() refreshed.
spring上下文初始化的回調(diào)函數(shù)在上下文(ConfigurableApplicationContext)刷新(refresh)之前調(diào)用。

Typically used within web applications that require some programmatic initialization of the application context. For example, registering property sources or activating profiles against the {@linkplain ConfigurableApplicationContext#getEnvironment() context's environment}. See ContextLoader and FrameworkServlet support for declaring a "contextInitializerClasses" context-param and init-param, respectively.
通常被用作web應(yīng)用,在一些程序設(shè)計(jì)在spring容器初始化使用。比如說注冊一些熟悉配置或者激活一些配置文件針對(ConfigurableApplicationContext的getEnvironment()方法)。參考ContextLoader和FrameworkServlet支持定義一個(gè)"contextInitializerClasses"上下文參數(shù)或者初始化參數(shù)。

ApplicationContextInitializer processors are encouraged to detect whether Spring's org.springframework.core.Ordered Ordered} interface has been implemented or if the org.springframework.core.annotation.Order Order annotation is present and to sort instances accordingly if so prior to invocation.
支持Order注解。并且代表著執(zhí)行順序。

demo
定義MyApplicationContextInitializer繼承ApplicationContextInitializer接口

package com.zhihao.miao;

import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.annotation.Order;

@Order(2)
public class MyApplicationContextInitializer implements ApplicationContextInitializer{
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        System.out.println("bean count====="+applicationContext.getBeanDefinitionCount());
    }
}

定義另外一個(gè)MyApplicationContextInitializer2繼承ApplicationContextInitializer接口:

package com.zhihao.miao;

import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.annotation.Order;

@Order(1)
public class MyApplicationContextInitializer2 implements ApplicationContextInitializer {

    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        System.out.println("app name : " + applicationContext.getDisplayName());
    }
}

主類測試:

package com.zhihao.miao;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(Application.class);
        application.addInitializers(new MyApplicationContextInitializer());
        application.addInitializers(new MyApplicationContextInitializer2());
        ConfigurableApplicationContext context =application.run(args);
        context.close();
    }
}

執(zhí)行順序和@Order注解的順序相反,Order的value值越小表示越早執(zhí)行。

上面是關(guān)于自定義ApplicationContextInitializer的一種注冊方法,還有二種注冊方法,

第二種方式
在application.properties中定義:

context.initializer.classes=com.zhihao.miao.MyApplicationContextInitializer,com.zhihao.miao.MyApplicationContextInitializer2

主類測試:

package com.zhihao.miao;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
       SpringApplication.run(Application.class,args);
    }
}

第三種方式
新建core-baen(名字自己定義)項(xiàng)目,新建一個(gè)MyApplicationContextInitializer實(shí)現(xiàn)ApplicationContextInitializer接口

package core.bean;

import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;

public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext>{

    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        System.out.println("========initialize=======");
    }
}

然后在core-bean項(xiàng)目下的resources下新建META-INF文件夾,文件夾下新建spring.factories文件

org.springframework.context.ApplicationContextInitializer=core.bean.MyApplicationContextInitializer

在項(xiàng)目中引入

<dependency>
    <groupId>com.zhihao.miao</groupId>
    <artifactId>core-bean</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

啟動類:

package com.zhihao.miao;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
       SpringApplication.run(Application.class,args);
    }
}

啟動啟動類并執(zhí)行:

總結(jié)

自定義ApplicationContextInitializer接口的方式:
1)寫一個(gè)類,實(shí)現(xiàn)ApplicationContextInitializer接口
2)注冊ApplicationContextInitializer

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容