spring 循环依赖以及扩展点分析
2021-03-25 13:35:57 0 举报
spring 循环依赖以及扩展点分析
作者其他创作
大纲/内容
InstantiationAwareBeanPostProcessor
整合所用扩展点框架案例:spring和mybatis整合 -> BeanFactoryPostProcessor接口和Nacos -> ApplicationListener接口和Eureka -> SmartLifecycle接口和Ribbon -> SmartInitializingSingleton接口和Sentinel -> BeanPostProcessor
postProcessBeforeInstantiation:实例化bean之前,相当于new这个bean之前
postProcessBeforeInitialization:初始化bean之前,相当于把bean注入spring上下文之前
BeanDefinitionRegistryPostProcessor
处理扫描后的bean定义
构造A
MergedBeanDefinitionPostProcessor
postProcessBeanFactory
这个应该不算spring&springboot当中的一个扩展点,ApplicationListener可以监听某个事件的event,触发时机可以穿插在业务方法执行过程中,用户可以自定义某个业务事件。但是spring内部也有一些内置事件,这种事件,可以穿插在启动调用中。我们也可以利用这个特性,来自己做一些内置事件的监听器来达到和前面一些触发点大致相同的事情。
initializeBean初始化BapplyBeanPostProcessorsAfterInitialization 会在此处被代理
ApplicationContextAwareProcessor
new zwzClassPathMapperScan(registry)
循环依赖
在bean的初始化阶段,如果对一个方法标注了@PostConstruct,会先调用这个方法。这里重点是要关注下这个标准的触发点,这个触发点是在postProcessBeforeInitialization之后,InitializingBean.afterPropertiesSet之前。
@Import(value=\"zwzImportBeanDefinitionRegister\")
getEarlyBeanReference:该触发点发生在postProcessAfterInstantiation之后,当有循环依赖的场景,当bean实例化好之后,为了防止有循环依赖,会提前暴露回调方法,用于bean实例化的后置处理。
doScan方法中自定义扫描
invokeBeanFactoryPostProcessors
BeanFacotryAware
DisposableBean
setBeanClass(BeanFactory.class)
@EnableMapperScan
ApplicationContext
InitializingBean
BeanNameAware
自定义Scanner(继承ClassPathBeanDefinitionScanner)去扫描Mapper接口
ApplicationContext做refresh之前ApplicationContextInitializer.initialize(application)
SmartInitializingSingleton
registerBeanDefinition
A初始化
A半成品注入B完成品
refresh
谈谈你对Spring IOC理解
修改Bean定义的用法
invokeAwareInterfaces:该类本身并没有扩展点,但是该类内部却有6个扩展点可供实现 ,这些类触发的时机在bean实例化之后,初始化之前
接口也只有一个方法:run(String... args),触发时机为整个项目启动完毕后,自动执行。如果有多个CommandLineRunner,可以利用@Order来进行排序。使用场景:用户扩展此接口,进行启动项目之后一些业务的预处理。
可以扩展这个类,来为要实例化的bean作一个代理,比如为该对象的所有的方法作一个拦截,在调用前后输出一行log,模仿ProxyFactoryBean的功能
SmartInstantiationAwareBeanPostProcessor
解析切面
ApplicationContextInitializer
获取对应注解以及相关属性并进行对应逻辑的处理
不算扩展点
CommandLineRunner
这个扩展点也只有一个方法:destroy(),其触发时机为当此对象销毁时,会自动执行这个方法。比如说运行applicationContext.registerShutdownHook时,就会触发这个方法。
spring 扩展点汇总
(MapperProxy implements InvocationHandler).invoke()
bean的初始化之前,也就是postProcessBeforeInitialization之前触发方法setBeanName可以用来修改这个beanName的值
B属性注入
postProcessAfterInstantiation:实例化bean之后,相当于new这个bean之后
依赖于B
postProcessAfterInitialization:初始化bean之后,相当于把bean注入spring上下文之后作用:对实现了某一类接口的bean在各个生命期间进行收集,或者对某个类型的bean进行统一的设值等等
getConstructorArgumentValues().addGenericArgumentValue(sourceClass)
A属性输入
链式递归调用
FactoryBean
构造B
InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法。这个扩展点的触发时机在postProcessAfterInitialization之前
A初始化完成
依赖注入
此处即可修改bean定义(beanClass等等)以及修改有参构造
切面植入到目标对象
BeanFactoryPostProcessor
高扩展性
afterSingletonsInstantiated:作用是是 在spring容器管理的所有单例对象(非懒加载对象)初始化完成之后调用的回调接口。其触发时机为postProcessAfterInitialization之后。用户可以扩展此接口在对所有单例对象初始化完毕后,做一些后置的业务处理。
生成代理对象
循环依赖流程分析
zwzImportBeanDefinitionRegister
postProcessMergedBeanDefinition
AOP
ApplicationListener
将A(半成品)一个ObjectFacotry加入三级缓存(对象工厂)
@PostConstruct
控制反转
0 条评论
下一页