SpringIOC流程
2021-06-11 13:01:48 0 举报
SpringIOC流程
作者其他创作
大纲/内容
提交afterReturning
切面
asm
bean初始化用户自定义初始化方法init-method
MethodInterceptor
动态代理
用户需要的对象
expression表达式
给部分类添加日志
4
核心逻辑
5中消息通知只是spring中原生提供的支持通知,自己在记性实现的时候可以参考实现,但是没必要费用它本身的模板
AOP
9
抽象层
实际代码逻辑之前执行
实例化
BeanPostProcessor
advice1
IOC容器
A中有属性B
AOP动态代理
初始化
通知
singleletonObjects
AbstractAutoProxyCreator
通过某个技术在程序运行期间,根据需求动态的创建字节码文件,生成的字节码文件可以在内存中,也可以溢出到磁盘,但最终要有一个class文件
afterThrowing
B
container
按照某一个类别匹配
around
逻辑代码
context.getBean(XX.class)
jdk
3
连接点
Method-->class C
在不同的阶段如果要做不同的操作怎么办?观察者模式:监听器,事件发布当发布不同的事件之后,监听器接受到之后开始做相应的工作
AOP的执行过程
BeanFactory
IOC容器,存放对象,先准备存放容器的对象
完整对象
After
getObject()方法,此方法执行匿名内部类
BeanFactoryPostProcessor
重新生成或者在原来的class文件基础上,直接添加日志处理相关逻辑即可
在堆中开辟空间属性有默认值
PostProcessor后置处理器增强器
AbstractApplicationContext
环绕通知Around
5
jvm
Spring
织入
注解
CglibMethodInvocation
bean实例化
BeanDefinitionReader
面向切面编程
advice
调用具体的方法开始进行调用
Before
学习方法:1.先理解流程,不懂流程不要看细节2.大胆猜测,仔细验证3.不要忽略原码中的注释
new
匹配方法
有异常
一级缓存
InvocationHandler
循环依赖
手动修改
过滤器
1
可以将各种通知的编写方式拿过来进行借鉴
Class clazz = Person.class;Constructor ctor = clazz.getConstructor();Object onj = ctor.newInstance();
8
向下执行
1.什么是循环依赖?2.Spring中如何解决循环依赖问题3.为什么要使用三级缓存解决循环依赖问题?一级缓存行不行?二级缓存行不行?
额外逻辑
生成新的字节码文件
方法后
2
cglib
二级缓存
麻烦
创建对象的过程?实例化和初始化属性赋值在哪个环节完成?初始化:调用有参构造或者set
返回值
方法名方法参数方法的返回值完全限定名
class文件
回滚afterThrowing
DefaultSingletonBeanRegistry
refresh()刷新
实践
cglik
Around
通过反射创建对象:Person.class.newInstance();
功能
afterReturning
list集合通过下标获取
通过一个消息通知来搞定所有事情,怎么办?
A
0
Eenvironment
想在这些写好的方法上添加一些日志处理工作,怎么办?方法少/可以修改:在方法前后添加日志处理。当方法多时,有没有一种匹配机制/规则匹配方法,然后添加对应的日志处理?
chain对象
xml<bean id=? class=?> <property name=? value=?> <property name=? ref=?></bean><bean id=? class=?> <constructor-arg name=? value=?> <constructor-arg name=? ref=?></bean>
java文件
属性填充
Method-->class B
简单,不需要了解生成的机制
Method-->class A
方法前
编程思想
6
1.对象谁创建?Spring容器2.Spring中对象如何创建?
TransactionInterceptor
没有异常
存放对象的容器
回调
B中有属性A
用户自定义
工厂
类似于正则表达式的东西匹配
new反射
对象的实例化和初始化操作,将生成的完整对象放到容器中存放具体的对象
框架动态生成
容器运行中需要的对象
earlySingletonObjects
IOC控制反转
JDK动态代理
<bean id=? class=?> <property name=? value=?> <constructor-arg name=? value=?></bean>
是否有异常
为什么看源码?1.面试2.借鉴思想3.二次开发
规范要求
对象创建
属性填充populatedBean
异常
三级缓存
exposeInvcationInterceptor
mapK-V名称-对象
Bean的生命周期
前提保证:创建的所有对象都是单例对象
数据库操作
5个通知都需要执行,因此需要嵌入责任链模式来进行调用
如何通过aop的方式实现统一的功能:声明式事务
初始化方法
通知想要执行的时候,需要进行相关的拦截,需要实现MethodInterceptor
7
132
正常情况下,spring中的每一个advice都要实现MethodInterceptor接口,之所以没有看到是因为其中有适配器模式的使用,因此看不到具体的实现
完成面向切面编程的所有操作
10
实际代码逻辑之后执行
反射
切点
从已经创建好的容器中获取需要的对象
bean定义信息BeanDefinition
读取器
集合框架
拦截
循环依赖问题:如果是构造器方式,解决不了如果是set方式,可以使用三级缓存解决
singletonFactories
责任链模式
方法的哪些位置可以添加代码?
打开连接,开启事务Before
0 条评论
回复 删除
下一页