一、.简述
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<C extends ConfigurableApplicationContext> {
/**
* Initialize the given application context.
* @param applicationContext the application to configure
*/
void initialize(C applicationContext);
}
三.简单的实现使用,自定义初始化器
3.1 用maven建好后创建的类如下
pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.fai</groupId>
<artifactId>springboot04</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!--spring boot 环境:方法二:依赖管理加上导入import pom。代替继承,注意 [scope,type]标签-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.10.RELEASE</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<!--<artifactId>springboot-boot-starter-web</artifactId>-->
<artifactId>spring-boot-starter</artifactId>
<version>1.5.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>
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...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。