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
方法将被调用。