ApplicationContextInitializer接口

ApplicationContextInitializer接口是在spring容器刷新之前执行的一个回调函数。

发现这个接口是定义在org.springframework.context包下的。看看其javadoc:

Callback interface for initializing a Spring ConfigurableApplicationContext
prior to being ConfigurableApplicationContext#refresh() refreshed.
spring上下文初始化的回调函数在上下文(ConfigurableApplicationContext)刷新(refresh)之前调用。

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应用,在一些程序设计在spring容器初始化使用。比如说注册一些熟悉配置或者激活一些配置文件针对(ConfigurableApplicationContext的getEnvironment()方法)。参考ContextLoader和FrameworkServlet支持定义一个"contextInitializerClasses"上下文参数或者初始化参数。

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注解。并且代表着执行顺序。

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());
    }
}

定义另外一个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();
    }
}

执行顺序和@Order注解的顺序相反,Order的value值越小表示越早执行。

上面是关于自定义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(名字自己定义)项目,新建一个MyApplicationContextInitializer实现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项目下的resources下新建META-INF文件夹,文件夹下新建spring.factories文件

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

在项目中引入

<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);
    }
}

启动启动类并执行:

总结

自定义ApplicationContextInitializer接口的方式:
1)写一个类,实现ApplicationContextInitializer接口
2)注册ApplicationContextInitializer

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容