https://mp.weixin.qq.com/s/e1WBaOC2u7HZpec3XDCqcQ

一、什么是 Spring Boot 扩展接口?

    Spring Boot 本质上是基于 Spring Framework 构建的自动化容器框架。 它通过大量的 SPI(Service Provider Interface)与 Callback 接口,为开发者开放了“生命周期中的插口”。你可以把这些接口理解为“回调监听器”:框架在运行到某个阶段,会主动回调这些接口,让你可以在关键时机介入执行逻辑。比如:容器启动前后(ApplicationContext 初始化)Bean 加载前后(BeanFactoryPostProcessor、BeanPostProcessor)配置文件加载时(EnvironmentPostProcessor)自动装配阶段(ImportSelector、ImportBeanDefinitionRegistrar)启动命令行(CommandLineRunner、ApplicationRunner)这套机制让 Spring Boot 不仅灵活,更是高度可扩展。

二、Spring Boot 常用扩展接口一览


三、核心扩展接口详解

  1. ApplicationContextInitializer作用:在 Spring 容器刷新前(refresh() 调用前)执行,允许你对 ConfigurableApplicationContext 做修改。使用场景:动态添加 PropertySource修改环境变量自定义上下文配置逻辑示例
public class MyContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    @Override
    public void initialize(ConfigurableApplicationContext context) {
        System.out.println("初始化上下文之前执行: " + context.getId());
    }
}
注册方式:在 META-INF/spring.factories 中添加:org.springframework.context.ApplicationContextInitializer=\
com.example.demo.config.MyContextInitializer

本文由“壹伴编辑器”提供技术支持

  1. EnvironmentPostProcessor作用:在 ApplicationContext 创建前执行,用来在最早阶段定制 Environment。典型应用:动态加载配置文件修改环境变量(比如根据命令行参数切换 profile)增强 application.yml 的配置逻辑
public class CustomEnvironmentPostProcessor implements EnvironmentPostProcessor {
    @Override
    public void postProcessEnvironment(ConfigurableEnvironment env, SpringApplication app) {
        env.getPropertySources().addFirst(new MapPropertySource("custom", Map.of("project.version", "1.0.9")));
    }
}

注册方式同样是 spring.factories。
本文由“壹伴编辑器”提供技术支持

  1. BeanFactoryPostProcessor作用:允许你在 Bean 定义加载完成 但 尚未实例化 之前修改 Bean 元数据。实战应用:动态替换 Bean 属性扫描包路径自定义注册 Bean反射修改 Bean 定义(例如替换实现类)
@Component
public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
        BeanDefinition bd = beanFactory.getBeanDefinition("dataSource");
        bd.getPropertyValues().add("url", "jdbc:mysql://custom-db:3306/demo");
    }
}

本文由“壹伴编辑器”提供技术支持

  1. BeanPostProcessor作用:拦截 Bean 的创建过程,在初始化前后做增强。常见应用:打印 Bean 加载日志动态代理 Bean(AOP 基础)注解扫描增强@Component
public class LogBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String name) {
        System.out.println("Before init: " + name);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String name) {
        System.out.println("After init: " + name);
        return bean;
    }
}

本文由“壹伴编辑器”提供技术支持

  1. ApplicationListener作用:监听容器生命周期中的各种事件,比如:
    ApplicationStartedEventApplicationReadyEventContextClosedEvent
@Component
public class StartListener implements ApplicationListener<ApplicationStartedEvent> {
    @Override
    public void onApplicationEvent(ApplicationStartedEvent event) {
        System.out.println("Spring Boot 已启动完成!");
    }
}

本文由“壹伴编辑器”提供技术支持

  1. ImportSelector作用:根据条件选择要导入的配置类(类似自动装配的开关)。
public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata metadata) {
        return new String[]{"com.example.demo.config.CustomConfig"};
    }
}

配合 @Import 使用:@Import(MyImportSelector.class)
@Configuration
public class AppConfig {}
本文由“壹伴编辑器”提供技术支持

  1. ImportBeanDefinitionRegistrar作用:比 ImportSelector 更底层,可以手动注册任意 BeanDefinition。
public class MyRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata meta, BeanDefinitionRegistry registry) {
        RootBeanDefinition def = new RootBeanDefinition(UserService.class);
        registry.registerBeanDefinition("userService", def);
    }
}

本文由“壹伴编辑器”提供技术支持

  1. CommandLineRunner容器启动后执行逻辑,常用于初始化任务。
@Component
public class StartupRunner implements CommandLineRunner {
    @Override
    public void run(String... args) {
        System.out.println("系统启动参数:" + Arrays.toString(args));
    }
}

本文由“壹伴编辑器”提供技术支持

  1. ApplicationRunner与 CommandLineRunner 类似,但参数封装为 ApplicationArguments。
@Component
public class MyAppRunner implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) {
        System.out.println("启动参数:" + args.getOptionNames());
    }
}

本文由“壹伴编辑器”提供技术支持

  1. SpringApplicationRunListener作用:监听整个 Spring Boot 启动过程,从创建环境到应用就绪。使用场景:统计启动耗时定制启动流程
public class AppRunListener implements SpringApplicationRunListener {
    public AppRunListener(SpringApplication app, String[] args) {}
    public void starting() { System.out.println("应用开始启动..."); }
}

注册于 spring.factories。
本文由“壹伴编辑器”提供技术支持

  1. WebMvcConfigurer作用:定制 MVC 组件行为。
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LogInterceptor());
    }

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**").allowedOrigins("*");
    }
}

本文由“壹伴编辑器”提供技术支持

  1. Condition控制 Bean 的装配条件。 你可以编写自定义条件类,实现更智能的配置逻辑。
public class OnWindowsCondition implements Condition {
    @Override
    public boolean matches(ConditionContext ctx, AnnotatedTypeMetadata md) {
        return System.getProperty("os.name").contains("Windows");
    }
}

配合 @Conditional(OnWindowsCondition.class) 使用。
本文由“壹伴编辑器”提供技术支持

  1. ConfigurationPropertiesBindingPostProcessor控制 @ConfigurationProperties 属性的绑定行为。 可用来自定义类型转换、校验逻辑等。
    本文由“壹伴编辑器”提供技术支持
  2. AutoConfigurationImportSelectorSpring Boot 自动配置的核心实现。 如果你想自定义 Starter,可以通过继承它来控制自动装配逻辑。
    本文由“壹伴编辑器”提供技术支持
  3. SmartInitializingSingleton在所有单例 Bean 初始化完成后触发。 常用于依赖 Bean 的初始化协同。
@Component
public class DataInitializer implements SmartInitializingSingleton {
    @Override
    public void afterSingletonsInstantiated() {
        System.out.println("所有单例 Bean 已加载完毕!");
    }
}

本文由“壹伴编辑器”提供技术支持

  1. DisposableBean在 Bean 销毁前执行清理任务。
@Component
public class ResourceCleaner implements DisposableBean {
    @Override
    public void destroy() {
        System.out.println("应用销毁前释放资源");
    }
}

总结
Spring Boot 的魅力,从来不只是“能跑起来”,而是可定制、可扩展、可观察。 掌握这 16 个扩展接口,你能做到:控制启动流程改写默认逻辑优雅增强 Bean 生命周期实现业务与框架的无缝集成这些接口是你理解 Spring Boot 自动化背后的“通道”,也是定制框架行为的最优入口。

文档更新时间: 2025-10-31 09:23   作者:admin