springboot 5个扩展点
1、初始化器ApplicationContextInitializer
ApplicationContextInitializer 是 Spring 框架中的一个接口,它允许你在 Spring 的 ApplicationContext 被刷新(refresh)之前执行一些自定义的初始化操作。通常,这在你需要在 Spring 的 bean 定义被加载和解析之前执行一些特定的逻辑时非常有用。
使用场景
- 修改环境属性:你可以使用
ApplicationContextInitializer来修改 Spring 的环境属性,例如添加或覆盖属性源。 - 注册自定义的
BeanPostProcessor:在ApplicationContext被刷新之前,你可能需要注册自定义的BeanPostProcessor。 - 执行一些早期的初始化操作:有些操作需要在 Spring 容器完全初始化之前执行,例如初始化某些资源或执行一些预加载的任务。
如何使用
要使用 ApplicationContextInitializer,你需要实现该接口,并重写 initialize 方法。然后,你需要将这个实现类注册到 Spring 容器中。
下面是一个简单的例子:
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("ApplicationContextInitializer 执行了!");
}
}
注册到 Spring 容器中:
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
public class MainApp {
public static void main(String[] args) {
AbstractApplicationContext context = new AnnotationConfigApplicationContext();
context.addInitializer(new MyApplicationContextInitializer());
context.register(AppConfig.class);
context.refresh();
}
}
在上面的例子中,MyApplicationContextInitializer 会在 AppConfig 中的 bean 定义被加载和解析之前执行。
注意
ApplicationContextInitializer的执行顺序是按照它们被添加到ApplicationContext中的顺序来确定的。- 如果你想在 Spring 容器完全初始化之后执行某些操作,可以考虑使用
ApplicationListener监听ContextRefreshedEvent事件。
总的来说,ApplicationContextInitializer 提供了一个机制,允许你在 Spring 的 ApplicationContext 被刷新之前执行自定义的初始化操作。
2、监听器ApplicationListener
ApplicationListener 是 Spring 框架中的一个接口,用于监听 ApplicationContext 发出的事件。这是 Spring 提供的事件驱动机制的一部分。ApplicationListener 可以监听内置事件和自定义事件。
内置事件
内置事件主要是围绕 ApplicationContext 的生命周期触发的。与 ApplicationListener 配合使用的是 ApplicationContextEvent,它分为以下几种:
- ContextRefreshedEvent:当
ApplicationContext被初始化或刷新时触发。 - ContextStartedEvent:当
ApplicationContext启动时触发。 - RequestHandledEvent:这是一个特定于 web 的事件,告诉所有 bean HTTP 请求已经被服务。它只能应用于使用
DispatcherServlet的 Web 应用。
自定义事件
除了内置事件,你还可以定义自己的事件,并通过实现 ApplicationListener 接口来监听它们。例如,你可以创建一个名为 MyApplicationListener 的类,实现 ApplicationListener 接口,并指定它要监听的事件类型。
使用场景
ApplicationListener 通常用于实现事件驱动模型开发。例如,你可能想在 ApplicationContext 刷新或启动时执行某些操作,或者在处理 HTTP 请求后执行某些操作。通过监听相应的事件,你可以在这些事件发生时执行自定义的逻辑。
如何使用
要使用 ApplicationListener,你需要创建一个类并实现 ApplicationListener 接口,然后指定要监听的事件类型。然后,你可以将这个监听器注册到 Spring 容器中,或者使用注解(如 @Component)将其声明为一个 bean。
例如:
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
@Component
public class MyApplicationListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
// 在这里执行你的逻辑
System.out.println("ContextRefreshedEvent 被触发了!");
}
}
在上面的例子中,MyApplicationListener 是一个监听 ContextRefreshedEvent 的监听器。当 ApplicationContext 被刷新时,它的 onApplicationEvent 方法将被调用。