SpringBoot启动扩大点整顿

1. 前言

在Springboot服务启动阶段,Springboot提供了许多扩大点。在理论的业务开发过程中,局部非凡的业务需要须要再Springboot服务启动过程中动静的加载配置或者执行业务解决,特此将罕用的Springboot启动扩大点做一个简略的整顿。

2. 筹备阶段


2.1 EnvironmentPostProcessor

  • 接口门路
org.springframework.boot.env.EnvironmentPostProcessor
  • 官网阐明

    • 容许在刷新应用程序上下文之前自定义应用程序的Environment
    • 须要在META-INF/spring.factories文件中定义

Allows for customization of the application's {@link Environment} prior to the application context being refreshed.

EnvironmentPostProcessor implementations have to be registered in {@code META-INF/spring.factories}, using the fully qualified name of this class as the key.

  • 利用场景

能够加载自定义的配置文件并增加至Environment中

  • 回调机会

  • 代码示例
public class DemoEnvironmentPostProcessor implements EnvironmentPostProcessor {    @Override    public void postProcessEnvironment(@NonNull ConfigurableEnvironment environment, @NonNull SpringApplication application) {        System.out.println(">>> 执行EnvironmentPostProcessor.postProcessEnvironment()办法");    }}
  • 失效形式

META-INF/spring.factories文件中增加内容

org.springframework.boot.env.EnvironmentPostProcessor = com.example.demo.extension.DemoEnvironmentPostProcessor

2.2 ApplicationContextInitializer

  • 接口门路
org.springframework.context.ApplicationContextInitializer
  • 利用场景

Spring会在容器刷新之前调用此类的initialize办法,能够激活一些配置或者获取Enviroment进行一些业务解决。

  • 回调机会

  • 代码示例
public class DemoApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {    @Override    public void initialize(@NonNull ConfigurableApplicationContext applicationContext) {        System.out.println(">>> 执行ApplicationContextInitializer.initialize()办法");    }}
  • 失效形式

    META-INF/spring.factories文件中增加内容

    org.springframework.context.ApplicationContextInitializer = com.example.demo.extension.DemoApplicationContextInitializer

3. 刷新上下文容器阶段

这部分的接口在执行refreshContext(context)办法刷新上下文的过程中回调。

3.1 BeanDefinitionRegistryPostProcessor

  • 接口门路
org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor
  • 利用场景

这个接口在读取我的项目中的beanDefinition之后执行,提供一个补充的扩大点,动静注册本人的beanDefinition,能够加载classpath之外的bean。

  • 回调机会

  • 代码示例
@Componentpublic class DemoBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {    @Override    public void postProcessBeanDefinitionRegistry(@NonNull BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {        System.out.println(">>> 执行BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry()办法");    }    @Override    public void postProcessBeanFactory(@NonNull ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {        System.out.println(">>> 执行BeanDefinitionRegistryPostProcessor.postProcessBeanFactory()办法");    }}

3.2 BeanFactoryPostProcessor

  • 接口门路
org.springframework.beans.factory.config.BeanFactoryPostProcessor
  • 利用场景

这个接口是beanFactory的扩大接口,调用机会在spring在读取beanDefinition信息之后,实例化bean之前。在这个机会,用户能够通过实现这个扩大接口来自行处理一些货色,比方批改曾经注册的beanDefinition的元信息。

  • 回调机会

AbstractApplicationContext类的refresh办法中被执行。

  • 代码示例
@Componentpublic class DemoBeanFactoryPostProcessor implements BeanFactoryPostProcessor {    @Override    public void postProcessBeanFactory(@NonNull ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {        System.out.println(">>> 执行 BeanFactoryPostProcessor.postProcessBeanFactory()办法");    }}

3.3 BeanFactoryAware和EnvironmentAware

  • 接口门路

org.springframework.beans.factory.BeanFactoryAware

org.springframework.context.EnvironmentAware

  • 利用场景

在bean实例化和属性注入之后执行,能够在bean初始化之前注入BeanFactoryEnvironment等在初始化阶段应用。

  • 回调机会

AbstractAutowireCapableBeanFactory类的createBean办法创立bean的过程中执行。

  • 代码示例
@Componentpublic class DemoBeanFactoryAware implements BeanFactoryAware {    @Override    public void setBeanFactory(@NonNull BeanFactory beanFactory) throws BeansException {        System.out.println(">>> 执行BeanFactoryAware.setBeanFactory()办法");    }}
@Componentpublic class DemoEnvironmentAware implements EnvironmentAware {    @Override    public void setEnvironment(@NonNull Environment environment) {        System.out.println(">>> 执行EnvironmentAware.setEnvironment()办法");    }}

3.4 InstantiationAwareBeanPostProcessor

  • 接口门路
org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor
  • 利用场景

InstantiationAwareBeanPostProcessor接口在BeanPostProcessor接口的根底上又扩大了3个办法,共蕴含5个办法,能够在bean的实例化前后,属性注入阶段以及初始化前后进行业务解决。例如Springboot中就是通过BeanPostProcessor的实现类来解析bean中带有@KafkaListener注解的办法来注册Kafka容器。

  • 回调机会

    • postProcessBeforeInstantiation办法:在bean实例化之前执行
    • postProcessAfterInstantiation办法:在bean实例化之后执行
    • postProcessProperties办法:在bean属性注入阶段执行
    • postProcessBeforeInitialization办法:在bean初始化之前执行
    • postProcessAfterInitialization办法:在bean初始化之后执行
  • 代码示例
@Componentpublic class DemoInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {    @Override    public Object postProcessBeforeInstantiation(@NonNull Class<?> beanClass, @NonNull String beanName) throws BeansException {        if (beanClass == DemoService.class) {            System.out.println(">>> 执行 InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()办法");        }        return InstantiationAwareBeanPostProcessor.super.postProcessBeforeInstantiation(beanClass, beanName);    }    @Override    public boolean postProcessAfterInstantiation(@NonNull Object bean, @NonNull String beanName) throws BeansException {        if (bean instanceof DemoService) {            System.out.println(">>> 执行 InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()办法");        }        return InstantiationAwareBeanPostProcessor.super.postProcessAfterInstantiation(bean, beanName);    }    @Override    public PropertyValues postProcessProperties(@NonNull PropertyValues pvs, @NonNull Object bean, @NonNull String beanName) throws BeansException {        if (bean instanceof DemoService) {            System.out.println(">>> 执行 InstantiationAwareBeanPostProcessor.postProcessProperties()办法");        }        return InstantiationAwareBeanPostProcessor.super.postProcessProperties(pvs, bean, beanName);    }    @Override    public Object postProcessBeforeInitialization(@NonNull Object bean, @NonNull String beanName) throws BeansException {        if (bean instanceof DemoService) {            System.out.println(">>> 执行 InstantiationAwareBeanPostProcessor.postProcessBeforeInitialization()办法");        }        return InstantiationAwareBeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);    }    @Override    public Object postProcessAfterInitialization(@NonNull Object bean, @NonNull String beanName) throws BeansException {        if (bean instanceof DemoService) {            System.out.println(">>> 执行 InstantiationAwareBeanPostProcessor.postProcessAfterInitialization()办法");        }        return InstantiationAwareBeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);    }}

3.5 @PostConstruct注解

  • 注解门路
javax.annotation.PostConstruct
  • 利用场景

能够在bean的初始化阶段执行初始化办法进行业务解决。

  • 回调机会

AbstractAutowireCapableBeanFactory类的createBean办法创立bean的过程中InitDestroyAnnotationBeanPostProcessor类的postProcessBeforeInitialization办法中执行。

  • 代码示例
@Servicepublic class DemoService {    @PostConstruct    public void init() {        System.out.println(">>> 执行 @PostConstruct注解办法");    }}

3.6 InitializingBean

  • 接口门路
org.springframework.beans.factory.InitializingBean
  • 利用场景

同样能够在执行bean初始化过程中执行业务解决。

  • 回调机会

AbstractAutowireCapableBeanFactory类的createBean办法创立bean的过程中AbstractAutowireCapableBeanFactory类的initializeBean办法中执行。

  • 代码示例
@Componentpublic class DemoInitializingBean implements InitializingBean {    @Override    public void afterPropertiesSet() throws Exception {        System.out.println(">>> 执行InitializingBean.afterPropertiesSet()办法");    }}

3.7 SmartInitializingSingleton

  • 接口门路
org.springframework.beans.factory.SmartInitializingSingleton
  • 利用场景

在对所有单例对象初始化结束后,做一些后置的业务解决。

  • 回调机会

在类DefaultListableBeanFactorypreInstantiateSingletons的办法中执行。

  • 代码示例
@Componentpublic class DemoSmartInitializingSingleton implements SmartInitializingSingleton {    @Override    public void afterSingletonsInstantiated() {        System.out.println(">>> 执行SmartInitializingSingleton.afterSingletonsInstantiated()办法");    }}

3.8 SmartLifecycle

  • 接口门路
org.springframework.context.SmartLifecycle
  • 利用场景

在对所有单例对象初始化结束后,做一些后置的业务解决。SmartLifecycleLifecycle接口的根底上,扩大了3个办法。

其中,isAutoStartup()办法返回true时,Bean将在容器实现刷新阶段执行Lifecycle接口的start()办法;getPahase()办法用于返回SmartLifecycle的优先级。可联合配置文件的配置项来指定SmartLifecycle是否主动启动及启动的优先级。

  • 回调机会

AbstractApplicationContext类的finishRefresh办法中执行。

  • 代码示例
@Componentpublic class DemoSmartLifecycle implements SmartLifecycle {    @Override    public void start() {        System.out.println(">>> 执行SmartLifecycle.start()办法");    }    @Override    public void stop() {    }    @Override    public boolean isRunning() {        return false;    }}

4. 执行程序

通过日志能够看到各个扩大点的理论执行程序。

>>> 执行EnvironmentPostProcessor.postProcessEnvironment()办法>>> 执行ApplicationContextInitializer.initialize()办法>>> 执行 BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry()办法>>> 执行 BeanDefinitionRegistryPostProcessor.postProcessBeanFactory()办法>>> 执行 BeanFactoryPostProcessor.postProcessBeanFactory()办法>>> 执行 BeanFactoryAware.setBeanFactory()办法 >>> 执行 EnvironmentAware.setEnvironment()办法>>> 执行 InitializingBean.afterPropertiesSet()办法>>> 执行 InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()办法>>> 执行 InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()办法>>> 执行 InstantiationAwareBeanPostProcessor.postProcessProperties()办法>>> 执行 InstantiationAwareBeanPostProcessor.postProcessBeforeInitialization()办法>>> 执行 @PostConstruct注解办法>>> 执行 InstantiationAwareBeanPostProcessor.postProcessAfterInitialization()办法>>> 执行 SmartInitializingSingleton.afterSingletonsInstantiated()办法>>> 执行 SmartLifecycle.start()办法