spring IOC 循环依赖 aop
2022-01-18 21:44:28 0 举报
spring IOC 循环依赖 aop,spring三级缓存
作者其他创作
大纲/内容
调用具体的方法开始进行调用
1.实例化与初始化分开2.设置缓存来预存对象
完整的对象
afterRetuming
Environment
设置B对象中的a属性
IOC
TransactionInterceptorIransactionAspectSupport
afterThrowing
半成品
在用户的bean对象中如果需要调用到applicationContext类,需要实现ApplicationContextAware接口,然后自己实现里面的setApplicationContextAware()方法
源码
切点
JDK
第五步时同时删除该缓存
9
操作数据库
BeanFactoryProcessor
list集合中通过下标获取
应用场景:1.日志
从容器中获取A对象
BeanProstProcessor
0
切面
多个BeanFactoryPostPorcessor对BeanFactory进行修改和扩展
循环依赖的问题是设置属性的问题
循环创建对象
before
创建A的runtimeReference寻找B对象
3. K.av.A@1624
afterReturning
AOP声明式事务
增强beanAOP
第四步时同时删除该缓存
解析bean信息
4
织入
advice
创建B
5. K.av.A@1624
用户需要的对象
context.getBean(\"user\")context.getBean(User.class)
容器的对象applicationContext
没有
有
after
5中消息通知只是spring中原生提供的支持通知,自己在进行实现的时候可以参考实现,但是没必要非用它的模板可以将通知拿过来借鉴
容器
methodInterceptor
执行Aware接口的方法
一级缓存
增强器,后置处理器
提前暴露对象
事务
设计模式
BeanPostProcessor
A
方法前
IOC容器,存放对象,先准备存放对象的容器
实例化A对象
完成对BeanFactory相关信息的修改活着扩展
6
用户自定义
10
7
yaml
properties
around
AOP
创建对象
注解
AbstractAutoProxyCreator
spring的生命周期
完成对Bean的修改或者扩展
创建A对象
缓存
B@1967
创建B的runtimeReference寻找A对象
xml
8
注解能被识别,都需要含有@component
Prostprocessor
brfore
cglib
实现类:ConfigurationClassParser
方法后
移除二级缓存
5
初始化操作
在三级缓存中拿出runtimeReference,返回给B
返回值
A@1624
method3 > class C
填充属性
Constructor ctor = clazz.getDeclaredConsttructor();Object obj = ctor.newInstance();
2
1.不要忽略注释2.合理的使用工具(transalate【翻译插件】,sequence)3.梳理脉络,然后再扣细节
处理配置文件bean定义的占位符,如mysql的配置等
填充属性值
三级缓存put
用户Bean对象
实例化
spring解决循环依赖的完整流程
Map
设置A对象中的b属性
传播特征
定义bean信息
@FunctionalInterface //函数式接口interface ObjectFactory<T>{ T getObject();}
在堆中开劈一块内存空间,属性默认值
createBeanInstance
4. K.av.A@1624
CglibMethodInvocation
创建A
spring 创建对象流程
移除三级缓存A,存入A到二级缓存中
exposeInvcationInterceptor
2. K.bv.lambda
三级缓存
回滚AfterThrowing
SET 设置属性
构造器无法解决
直接赋值
类似于正则表达式来匹配
bean
容器运行过程中需要的对象
正常情况下,spring中的每个advice都要实现methodInterceptor接口,之所以你没有看到,是因为在适配器模式的使用,因此看不到具体的实现
Before
spring
B
spring通过提前暴露对象的方式解决循环依赖问题
代码之前执行的
进行对象实例化和初始化操作,将生成的完整对象放到容器中
有异常
init-method
populateBean
method1 > class A
doCreateBean
method2 > class B
责任链模式
询问A对象开始创建了吗?
循环依赖
每一次执行需要回到链上该链是经过拓扑排序的,必须是按照顺序的
spring中有几种bean
After
是否有异常
容器,存储对象,map存储
BeanFactoryPostProcessor
有几个缓存
方法可以在那些地方加
实例化阶段如果这个时候直接去拿B对象去使用还是有问题,所以拿不到
创建B对象
aop所有操作
完整体
打开连接,开启事务before
BeanFactory
反射:Class clazz = Class.forName()Class clazz = 类名.class;Class clazz = 对象名.getClass();Constructor ctor = clazz.getDeclaredConsttructor();Object obj = ctor.newInstance();
匹配方法
配置文件替换处理ConfigurationClassPostProcesson
存入B到三级缓存
1
通过某个技术在程序运行期间,根据需求动态的创建字节码(class)文件,生成的字节码,可以在内存中,也可以溢写在磁盘,但是最终要有一个class文件
createBean
对象的引用
连接点
逻辑代码
嵌入AfterThrowing
生命周期
抽象BeanDefinitionReader
从已经创建好的容器中获取需要的对象
Aware是帮助某些bean能够获取容器的对象
存放bean
异常
当获取到BeanDefintionNames之后,需要从容器中获取对象,如果获取不到才创建
方法名字方法参数方法的返回值完全的限定名
完成实例化但未完成初始化对象此时对象为半成品对象
applicationContext
1. K.av.lambda
初始化
没异常
第三步时同时删除该缓存
getBean
按照某一个类别匹配
Around(环绕)
实例化B对象
ASM生成class字节码的框架
只有当所有的通知执行完毕之后才会调用实际的方法,而之前调用的advice只是为了指定通知的执行顺序,把链中的执行逻辑都罗列清除,按照具体的方法进行返回操作
销毁
从容器中获取B对象
缓存map
通过一个事务来搞定所有事
new反射
BeanDefinition
K-V格式的数据
通知advice
都是在实际代码执行之后才执行
chain对象
3
expression表达式
doGetBean
spring
通知
开始
面向切面编程
引用上面的创建对象图形
存入A到三级缓存
提交afterReturning
0 条评论
下一页