Spring IOC AOP
2021-04-14 13:47:21 1 举报
Spring Bean的生命周期、AOP、循环依赖等
作者其他创作
大纲/内容
判断是否有b对象
否
初始化B
new工厂反射
是
aware接口存在的意义是:方便通过Spring中的Bean对象来获取对应容器中的相关属性值
1. 三级缓存解决循环依赖问题的关键是什么,为什么通过提前暴露对象能解决?实例话和初始化分开操作,在中间过程中给其他对象赋值的时候,并不是一个完整的对象,而是把半成品对象赋值给了其他对象2. 如果只使用一级缓存能不能解决问题?不能。在整个处理过程中,缓存中放的是半成品和成品对象,如果只有一级缓存,那么成品和半成品都会放在一级缓存中,有可能在获取过程中获取到半成品对象,此时半成品对象是无法使用的,不能直接进行相关的处理,因此要把半成品和成品对象的存放空间分割开来。3. 只使用二级缓存行不行?为什么需要三级缓存?如果我能保证所有的bean对象都不去调用getEarlyBeanReference此方法,使用二级缓存可以吗?是的。如果保证所有的bean对象都不调用此方法,就可以只使用二级缓存。使用三级缓存的本质在于解决AOP代理问题。4. 如果某个bean对象需要代理对象,那么会不会创建普通的bean对象?会,必须会5. 为什么使用了三级缓存就可以解决这个问题?当一个对象需要被代理的时候,在整个创建过程中是包含两个对象吧。一个是普通对象,一个代理生成的对象,bean默认都是单例的,那么我在整个生命周期的处理环节中,一个beanName能对应两个对象吗?不能,既然不能的话,保证我在使用的时候加一层判断,判断一下是否需要进行代理的对象。6. 我怎么知道你什么时候需要代理呢?因为不知道什么时候会调用,所以通过一个匿名内部类的方式,在使用的时候直接对普通对象进行覆盖操作,保证全局唯一。
jdk 接口/代理类
System.getEnv
FactoryBean 用于生产一些特殊的Bean 不用走Spring Bean的生命周期那个过程1. MyBatis 2. Feign
初始化A
抽象层BeanDefinitionReader
空对象
只是完成堆空间的开辟,并没有设置属性值
一级缓存singletonObjects
半成品对象
直接赋值成功
循环依赖set可以解决循环依赖的问题 因为set先有了当前对象,再进行赋值操作constructor 无法解决循环依赖的问题 因为构造方法创建对象时立马进行赋值了
new
1. 扩展,做一些属性替换${xxx}2.SpringBoot自动装配在BeanFactoryPostProcessor阶段实现
完整的可用对象
DefaultSingletonBeanRegistry
IOC
BeanDefinitionBean定义信息
给B对象中的a属性赋值,也去Spring容器中查找
容器和对象的创建流程:1. 先创建BeanFactory容器2. 加载配置文件,封装成BeanDefinition3. 调用执行BeanFactoryPostProcessor准备工作:准备BeanPostProcessor准备监听器、事件、广播器4. 实例化5. 初始化6. 获取到完整对象
xml
k: av: lambda
有
先实例化A
k: bv: B@2152成品
k: bv: lambda
FactoryBean
isSingleton
bean初始化init-method
查找a对象
如果想在不同的处理阶段做不同的事怎么办?观察者模式:监听器(监听事件)、多播器
再去实例化A
k: av: A@1755成品
Constructor ctor = Class.getConstructor();Object object = ctor.newInstance();
getObject
执行aware接口需要实现的方法
三级缓存singletonFactories
context.getBean()
k: av: A@1755半成品
cglib(ASM)
getObjectType
AOP在BeanPostProcessor阶段实现
BeanFacotry
二级缓存earlySingletonObjects
Spring的作用域:1. singleton 在Spring IOC容器中仅存在一个Bean实例,Bean以单例方式存在,Bean作用域范围的默认值2. prototype 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXXXBean()3. request 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于web的Spring WebApplicationContext环境4. session 同一个HTTP Session 共享一个Bean,不同Session使用不同的Bean。该作用域仅适用于web的WebApplicationContext环境5. application 限定一个Bean的作用域为ServletContext的生命周期。该作用域仅适用于web的WebApplicationContext环境
从三级缓存中查找,先从一级缓存中找,再去二级缓存找,最后去三级缓存中找
完成b对象的实例话
bean实例化
BeanPostProcessor:before
Spring是一个框架,还是一个生态,整个生态的基石,提供完整的扩展能力!
工厂
bean的定义信息
Environment
BeanFactoryPostProcessor
单例模式工厂模式代理模式责任链模式观察者模式模板方法模式(钩子函数)策略模式(抽象出一个接口)
System.getProperties
实例化B
AOP动态代理
容器有对象
BeanPostProcessor
populateBean
1. 一级缓存放成品对象2. 二级缓存放半成品对象3. 三级缓存放lambda表达式,,来完成代理对象的覆盖过程
此时要给b属性赋值,b是一个完全独立的对象,,所以此时要去spring容器中查找b对象
填充属性
注解
0 条评论
下一页