码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2021-04-06 15:11:09      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:元数据   gis   mapper   注入   ant   abc   ali   cap   构造函数   

最后我们用“Springboot中有哪些扩展点”这个话题来回顾一下Springboot的内容。SpringBoot和Spring中提供了很多扩展点,给开发者一个很大的灵活空间,按照启动的调用顺序,大概有如下扩展点。

 


    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/

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

标签:元数据   gis   mapper   注入   ant   abc   ali   cap   构造函数   

原文地址:https://www.cnblogs.com/jovic/p/14617784.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!