资讯专栏INFORMATION COLUMN

ApplicationContextInitializer接口

blankyao / 1913人阅读

摘要:注在类上标注,不是方法上方法是接口的方法,通过继承和实现拥有了该方法打印容器里面有多少个打印人所有个的名字如下的实现类接口是在容器刷新之前执行的一个回调函数。

一、.简述

ApplicationContextInitializer是Spring框架原有的概念, 这个类的主要目的就是在            ConfigurableApplicationContext类型(或者子类型)的ApplicationContext做refresh之前,允许我们                   对ConfigurableApplicationContext的实例做进一步的设置或者处理。

二、 ApplicationContextInitializer 接口源码:就一个方法

package org.springframework.context;
/*
注释部分第一段的大概意思刷新之前回调接口初始化spring,ConfigurableApplicationContext类型(或者子类型)的ApplicationContext做refresh之前,允许我们对ConfigurableApplicationContext的实例做进一步的设置或者处理。
     Callback interface for initializing a Spring {@link ConfigurableApplicationContext} prior to being {@linkplain ConfigurableApplicationContext#refresh() refreshed}....  
 */
 
 public interface ApplicationContextInitializer {

    /**
     * Initialize the given application context.
     * @param applicationContext the application to configure
     */
    void initialize(C applicationContext);

}


三.简单的实现使用,自定义初始化器
3.1 用maven建好后创建的类如下

pom文件:



4.0.0

com.fai
springboot04
1.0-SNAPSHOT
jar


    UTF-8
    1.8
    1.8




    
        
            org.springframework.boot
            spring-boot-dependencies
            1.5.10.RELEASE
            import
            pom
        
    



    
        org.springframework.boot
        
        spring-boot-starter
        1.5.10.RELEASE
    
    
        org.springframework.boot
        spring-boot-configuration-processor
        true
    




3.2.1 ApplicationContextInitializerImpl.java

/**
 * ApplicationContextInitializer的实现类
 *  ApplicationContextInitializer接口是在spring容器刷新之前执行的一个回调函数。
 */
@Order(111) // @Order的value值越小->越早执行。注:在类上标注,不是方法上
public class ApplicationContextInitializerImpl implements ApplicationContextInitializer {
/**
 *  applicationContext.getBeanDefinitionCount()
 *      getBeanDefinitionCount()方法 是ListableBeanFactory 接口的方法,        ConfigurableApplicationContext 通过继承和实现
 *      拥有了该方法
 */
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {

    // 打印容器里面有多少个bean
    System.out.println("bean count====="+applicationContext.getBeanDefinitionCount());

    // 打印人所有 beanName
    System.out.println(applicationContext.getBeanDefinitionCount()+"个Bean的名字如下:");
    String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
    for (String beanName : beanDefinitionNames) {
        System.out.println(beanName);
    }

}

}

3.2.2 ApplicationContextInitializerImpl2.java

/**
 * ApplicationContextInitializer的实现类
 *  ApplicationContextInitializer接口是在spring容器刷新之前执行的一个回调函数。
 */
 @Order(1) // @Order的value值越小->越早执行,注:在类上标注,不是方法上
public class ApplicationContextInitializerImpl2 implements ApplicationContextInitializer {
/**
 *  applicationContext.getBeanDefinitionCount()
 *      getBeanDefinitionCount()方法 是ListableBeanFactory 接口的方法,ConfigurableApplicationContext 通过继承和实现
 *      拥有了该方法
 */
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
    System.out.println("applicationContext.getApplicationName(),默认为空(看源码):"+applicationContext.getApplicationName());
    System.out.println("applicationContext.getDisplayName(),即context的name:"+applicationContext.getDisplayName());
}

}

3.2.3 MainApp.java

/**
 * ApplicationContextInitializer 理解
 *  1、写一个类实现该接口
 *  2、注册ApplicationContextInitializer
 *      2.1 方法一:springApplication.addInitializers(new ApplicationContextInitializerImpl());
 *      2.2 方法二:配置文件添加 context.initializer.classes=com.fai.test.ApplicationContextInitializerImpl  
                               context.initializer.classes=com.fai.test.ApplicationContextInitializerImpl2
       2.3 方法三:通过spring.factories文件配置(前面我们注册自定义监听器也可以用这个方法)
                   # key : 全类名,value : 实现类
                    org.springframework.context.ApplicationContextInitializer=
                    com.fai.test.ApplicationContextInitializerImpl,
                    com.fai.test.ApplicationContextInitializerImpl2 
 */
@SpringBootApplication
public class MainApp {
public static void main(String[] args) {

    SpringApplication application = new SpringApplication(MainApp.class);

    // 2.1 方法一:添加自定义的 ApplicationContextInitializer 实现类的实例(注册ApplicationContextInitializer)
    // 2.2 方法二:配置文件添加context.initializer.classes=com.fai.test.ApplicationContextInitializerImpl,context.initializer.classes=com.fai.test.ApplicationContextInitializerImpl2
    application.addInitializers(new ApplicationContextInitializerImpl());
    application.addInitializers(new ApplicationContextInitializerImpl2());

    ConfigurableApplicationContext context = application.run(args);

    context.close();

}

}

3.2.4 附录配置文件application.properties添加内容。用方法一就不需要该配置该内容,用法二要添加下面的内容context.initializer.classes=全类名,并且测试方法里面不用代码显示注册初始化器

#注册ApplicationContextInitializer
#context.initializer.classes=
  com.fai.test.ApplicationContextInitializerImpl,
  com.fai.test.ApplicationContextInitializerImpl2

4.测试结果:

5.小提示:IDEA 查看UML图
5.1 Ctr + Alt + S 查看是UML Support否打上勾

5.2 在你想要查看的类上右键-->Diagrams,快捷键Ctrl + Shift+ Alt + U


5.3 导出图片

导出的图片效果

6、声明:我这里的测试是 常规下,不是web应用下哦!
参考了 http://blog.csdn.net/dm_vince...
http://www.jianshu.com/p/3828...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71040.html

相关文章

  • 自定义ApplicationContextInitializer接口实现

    摘要:简介是框架提供的接口该接口的主要功能就是在接口刷新之前,允许用户对实例做一定的操作。该接口只有一个方法。实现该接口实现该接口,并在方法中打印容器中初始化了多少个对象。启动程序启动程序,打印日志容器中初始化数量原文链接 简介 ApplicationContextInitializer是Spring框架提供的接口, 该接口的主要功能就是在接口ConfigurableApplicationC...

    kk_miles 评论0 收藏0
  • 自定义ApplicationContextInitializer接口实现

    摘要:简介是框架提供的接口该接口的主要功能就是在接口刷新之前,允许用户对实例做一定的操作。该接口只有一个方法。实现该接口实现该接口,并在方法中打印容器中初始化了多少个对象。启动程序启动程序,打印日志容器中初始化数量原文链接 简介 ApplicationContextInitializer是Spring框架提供的接口, 该接口的主要功能就是在接口ConfigurableApplicationC...

    alin 评论0 收藏0
  • Spring Boot 2.x 启动全过程源码分析(上)入口类剖析

    摘要:设置应用上线文初始化器的作用是什么源码如下。来看下方法源码,其实就是初始化一个应用上下文初始化器实例的集合。设置监听器和设置初始化器调用的方法是一样的,只是传入的类型不一样,设置监听器的接口类型为,对应的文件配置内容请见下方。 Spring Boot 的应用教程我们已经分享过很多了,今天来通过源码来分析下它的启动过程,探究下 Spring Boot 为什么这么简便的奥秘。 本篇基于 S...

    MobService 评论0 收藏0
  • Spring Boot启动过程及回调接口汇总

    摘要:创建及准备创建。目前已知关心这个事件的有要注意的是在这个阶段,里只有,是的加载工作的起点。原因是注入这些回调接口本身没有什么意义。在其构造函数内部间接的给注册了几个与相关注解的处理器。 相关代码在: https://github.com/chanjarster/spring-boot-all-callbacks 注:本文基于spring-boot 1.4.1.RELEASE, spri...

    Taonce 评论0 收藏0
  • spring-framework源码研读

    摘要:额外知识点参考知识点加载策略资源后,容器启动时会调用的方法。从获取对象对象,如果存在则抛异常。这个是重点核心的知识点,参考知识点。看到这里应该知道每一层的作用吧,一层一层往上递进第四步正在研读 1.根据我们常用的web.xml里,我们找到的org.springframework.web.context.ContextLoaderListener。web.xml如下 moo...

    rottengeek 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<