Spring循环依赖原理
2021-11-28 16:48:41 10 举报
Spring循环依赖原理
作者其他创作
大纲/内容
BeanClassName
Java类
拿到要注入的类@Resource、@Autowired
UserService.java
完成 AOP 代理
通过反射创建对象
拿到 Bean 或者对象继而注入完成
A
OrderService.java
否
Bean的生命周期
isLazyInit
单例类实例化进单例池
Qualifier
B
ClassLoader
A 依赖 B、C
扫描拿到符合规则的类
需要依赖注入?
不需要
UserService Bean
推断构造方法
singletonObjects
将当前对象 put 进单例池
MethodOverrides
C
扫描、解析
生命周期回调
Spring 单例池
B 依赖 A、C
验证(单例、非Lazy、非Abstract)
......
是
IndexService.java
执行依赖对象的生命周期
C 依赖 A、B
PropertyValues
BeanClass
OrderService Bean
FactoryBeanName
BeanDefinition
Spring 容器实例化
允许循环依赖 & 将对象放入二级缓存(表明Bean在创建中)
销毁 Bean
beanClass=IndexService.class
xxx=xxx
IndexService Bean
InstanceSupplier
beanClassName=indexService
IndexService.class
缓存 BeanDefinition 信息
DependsOn
scope=sington
Spring 循环依赖 && Bean的生命周期
springUser.java ----> User.class ----new----> ObjectBeanDefinition ----> Beanhttps://gitee.com/AmosWang/resource/raw/master/image/spring/cycle-ref/init-bean-L3-cache.png一级缓存:singletonObjects不解释,也就是平时说的单例池,存放的是bean对象二级缓存:singletonFactories对象工厂,用于存放对象工厂,或者代理后的对象工厂三级缓存:earlySingletonObjects早期创建对象,这个对象可能是个半成品,还没有走完bean的生命周期
map
Class
isPrimary
代理对象
@Bean、@Controller、@Service、@Component等等符合Spring扫描规则的类
FactoryMethodName
EnforceInitMethod
解析类信息放入 BeanDefinition
constructorArgumentValues
Description
需要加 AOP ?
将当前对象(或代理对象)封装进 ObjectFactory
单例池中获取成功& 该Bean正在创建中
InitMethodName
put BeanDefinition to map
先决条件
isAbstract
收藏
收藏
0 条评论
下一页