Springboot中有哪些扩展点以及其应用场景
2021-06-06 03:04
-
ApplicationContextInitializer
Springboot中默认有以下实现,通常用于需要对应用程序上下文进行编程初始化的web应用程序中。例如,根据上下文环境注册属性源或激活配置文件等。在SpringApplication#applyInitializers方法中,会调用所有的ApplicationContextInitializer#initialize方法:
-
BeanDefinitionRegistryPostProcessor
顾名思义,就是BeanDefinition的后置处理器,AbstractApplicationContext#refresh方法中,会调用invokeBeanFactoryPostProcessors(beanFactory),最终会调用PostProcessorRegistrationDelegate#invokeBeanDefinitionRegistryPostProcessors
这个方法可以我们实现自定义bean并注册到BeanDefinitionRegistry,如上图可以看到MapperScannerConfigurer,Mybatis也是自己定义bean并注册的,我们也可以自定义bean并注册: -
BeanFactoryPostProcessor
顾名思义,就是BeanFactory的后置处理器,Spring IoC容器允许BeanFactoryPostProcessor在容器实例化任何bean之前读取bean的定义(配置元数据),并可以修改它。 -
SmartInstantiationAwareBeanPostProcessor
在Bean实例化前,AbstractAutowireCapableBeanFactory#createBeanInstance的时候,来决定实用bean的哪个构造函数,好像循环依赖也实用了这个后置处理器来提前暴露bean 的早期引用。 -
InstantiationAwareBeanPostProcessor
AbstractAutowireCapableBeanFactory#createBean方法中会调用resolveBeforeInstantiation:
在InstantiationAwareBeanPostProcessor的接口中,主要有如下几个方法:
postProcessBeforeInstantiation:自身方法,是最先执行的方法,它在目标对象实例化之前调用,该方法的返回值类型是Object,我们可以返回任何类型的值。由于这个时候目标对象还未实例化,所以这个返回值可以用来代替原本该生成的目标对象的实例(比如代理对象)。如果该方法的返回值代替原本该生成的目标对象,后续只有postProcessAfterInitialization方法会调用,其它方法不再调用;否则按照正常的流程走postProcessAfterInstantiation:在目标对象实例化之后调用,这个时候对象已经被实例化,但是该实例的属性还未被设置,都是null
postProcessPropertyValues:对属性值进行修改,如果postProcessAfterInstantiation方法返回false,该方法可能不会被调用。可以在该方法内对属性值进行修改
postProcessBeforeInitialization:在Bean的自定义初始化方法之前执行
postProcessAfterInitialization:在Bean的自定义初始化方法执行完成之后执行 -
BeanFactoryAware
在这里,Bean已经初始化完成,beanFactory让你可以不依赖注入方式,随意的读取IOC容器里面的对象 -
BeanNameAware
实在不知道这个接口有什么用 -
ApplicationContextAwareProcessor
这个是在Tomcat启动完成后调用finishBeanFactoryInitialization方法时触发的:
该类本身并不是直接的扩展点,但是该类内部有6个可以被实现的扩展点:EnvironmentAware,EmbeddedValueResolverAware,ResourceLoaderAware,ApplicationEventPublisherAware,MessageSourceAware,ApplicationContextAware(作用和BeanFactoryAware类似) -
InitializingBean
spring为bean提供了两种初始化bean的方式,实现InitializingBean接口,实现afterPropertiesSet方法,或者在配置文件中同过init-method指定,两种方式可以同时使用。InitializingBean的作用时机在于,对象创建并将所有的属性设置完成后,进行初始化,其初始化方法就是afterPropertiesSet方法。 -
FactoryBean
作用是在IOC容器中创建复杂的Bean,如org.mybatis.spring.SqlSessionFactoryBean -
SmartInitializingSingleton
在SpringApplication#refreshContext(context)中调用,是当所有单例 bean 都初始化完成以后调用的,主要应用场合就是在所有单例 bean 创建完成之后,可以在该回调中做一些事情,如EventListenerMethodProcessor: -
CommandLineRunner
如果想要在SpringApplication启动后做一些事情,我们可以实现CommandLineRunner或者ApplicationRunner接口。这2个接口都提供了一个run方法,这个run方法会在SpringApplication.run(…)完成之前被调用,如JobLauncherCommandLineRunner。更多了解请关注一米源码公众号并回复SpringBoot或https://itproject-manager.com/
上一篇:python PEP
文章标题:Springboot中有哪些扩展点以及其应用场景
文章链接:http://soscw.com/index.php/essay/91090.html