Springboot中有哪些扩展点以及其应用场景

2021-06-06 03:04

阅读:327


  1. ApplicationContextInitializer
    Springboot中默认有以下实现,通常用于需要对应用程序上下文进行编程初始化的web应用程序中。例如,根据上下文环境注册属性源或激活配置文件等。
    技术图片

    在SpringApplication#applyInitializers方法中,会调用所有的ApplicationContextInitializer#initialize方法:

    技术图片

  2. BeanDefinitionRegistryPostProcessor
    顾名思义,就是BeanDefinition的后置处理器,AbstractApplicationContext#refresh方法中,会调用invokeBeanFactoryPostProcessors(beanFactory),最终会调用PostProcessorRegistrationDelegate#invokeBeanDefinitionRegistryPostProcessors
    技术图片
    技术图片
    这个方法可以我们实现自定义bean并注册到BeanDefinitionRegistry,如上图可以看到MapperScannerConfigurer,Mybatis也是自己定义bean并注册的,我们也可以自定义bean并注册:    

    技术图片

  3. BeanFactoryPostProcessor
    顾名思义,就是BeanFactory的后置处理器,Spring IoC容器允许BeanFactoryPostProcessor在容器实例化任何bean之前读取bean的定义(配置元数据),并可以修改它。
    技术图片

  4. SmartInstantiationAwareBeanPostProcessor
    在Bean实例化前,AbstractAutowireCapableBeanFactory#createBeanInstance的时候,来决定实用bean的哪个构造函数,好像循环依赖也实用了这个后置处理器来提前暴露bean 的早期引用。
    技术图片

  5. InstantiationAwareBeanPostProcessor
    AbstractAutowireCapableBeanFactory#createBean方法中会调用resolveBeforeInstantiation:
    技术图片
    技术图片
    在InstantiationAwareBeanPostProcessor的接口中,主要有如下几个方法:
    postProcessBeforeInstantiation:自身方法,是最先执行的方法,它在目标对象实例化之前调用,该方法的返回值类型是Object,我们可以返回任何类型的值。由于这个时候目标对象还未实例化,所以这个返回值可以用来代替原本该生成的目标对象的实例(比如代理对象)。如果该方法的返回值代替原本该生成的目标对象,后续只有postProcessAfterInitialization方法会调用,其它方法不再调用;否则按照正常的流程走

    postProcessAfterInstantiation:在目标对象实例化之后调用,这个时候对象已经被实例化,但是该实例的属性还未被设置,都是null

    postProcessPropertyValues:对属性值进行修改,如果postProcessAfterInstantiation方法返回false,该方法可能不会被调用。可以在该方法内对属性值进行修改

    postProcessBeforeInitialization:在Bean的自定义初始化方法之前执行
    postProcessAfterInitialization:在Bean的自定义初始化方法执行完成之后执行
    技术图片

  6. BeanFactoryAware
    在这里,Bean已经初始化完成,beanFactory让你可以不依赖注入方式,随意的读取IOC容器里面的对象
    技术图片

  7. BeanNameAware
    实在不知道这个接口有什么用

  8. ApplicationContextAwareProcessor
    这个是在Tomcat启动完成后调用finishBeanFactoryInitialization方法时触发的:
    技术图片
    该类本身并不是直接的扩展点,但是该类内部有6个可以被实现的扩展点:EnvironmentAware,EmbeddedValueResolverAware,ResourceLoaderAware,ApplicationEventPublisherAware,MessageSourceAware,ApplicationContextAware(作用和BeanFactoryAware类似)

    技术图片

  9. InitializingBean
    spring为bean提供了两种初始化bean的方式,实现InitializingBean接口,实现afterPropertiesSet方法,或者在配置文件中同过init-method指定,两种方式可以同时使用。InitializingBean的作用时机在于,对象创建并将所有的属性设置完成后,进行初始化,其初始化方法就是afterPropertiesSet方法。
    技术图片

  10. FactoryBean
    作用是在IOC容器中创建复杂的Bean,如org.mybatis.spring.SqlSessionFactoryBean
    技术图片
    技术图片

  11. SmartInitializingSingleton
    在SpringApplication#refreshContext(context)中调用,是当所有单例 bean 都初始化完成以后调用的,主要应用场合就是在所有单例 bean 创建完成之后,可以在该回调中做一些事情,如EventListenerMethodProcessor:
    技术图片

  12. CommandLineRunner
    如果想要在SpringApplication启动后做一些事情,我们可以实现CommandLineRunner或者ApplicationRunner接口。这2个接口都提供了一个run方法,这个run方法会在SpringApplication.run(…)完成之前被调用,如JobLauncherCommandLineRunner。

    更多了解请关注一米源码公众号并回复SpringBoot或https://itproject-manager.com/

上一篇:python PEP

下一篇:Springboot如何集成Mybatis


评论


亲,登录后才可以留言!