Spring MVC 先生成web容器,比如TOMCAT ,然后注册 servletDispathcer,  Spring容器在DispatcherServlet里面

BeanPOSTProcessor 可以在bean生成后对bean属性进行更改

事务是基于切面来做的,代理对象会去获取一个数据库连接、获取到连接之后把自动提交关闭,然后才可以在捕获到异常时,对事务进行回滚。

因为是基于切面的实现,所以必须要有代理对象,这也能解释一部分事务失效的情况。

 

 

创建A 的时候,先生成A的普通对象,之后在一个set里面记录A对象正在创建(用于判断是否循环依赖)

之后将A的普通对象、bean名称、和bean描述 生成lambda 表达式放进 earlyFactoryMap里面

之后填充其他属性,如果涉及到B类,那么就要先去创建B类,先从一级缓存也就是单例池SingleMap里面找,

找不到就去二级缓存earlyBean早期beanMap里面找,找不到就去三级缓存里面找,都找不到,

所以新建B的普通对象,记录B正在创建,生成lambda表达式,放入earlyFactoryMap,

然后发现又依赖A,所以这个时候发现A正在创建,所以产生了循环依赖,所以取出A的lambda表达式来创建早期的A

创建完成后放入二级缓存(这一步如果A需要AOP,就生成代理对象,如果不需要就是普通对象),这个时候B就可以使用早期A对象

然后B继续往后走流程,这个时候B可能也需要AOP,那么B也会同样使用lambda表达式去完成这一步,然后放入二级缓存,然后B完成创建再放入三级缓存。

这个时候B创建完成,回到A里面,因为B已经完成,所以A里面的B填充成功,这个时候A继续往下走,当要AOP的时候发现二级缓存里面有,直接跳过AOP环节

将A从二级缓存放入三级缓存,这样循环依赖就解决了。

 

posted on 2023-03-16 16:05  追疯筝的人  阅读(77)  评论(0编辑  收藏  举报