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表达式,放入三级缓存,
然后发现又依赖A,所以这个时候发现A正在创建,所以产生了循环依赖,所以取出A的lambda表达式来创建早期的A
创建完成后放入二级缓存(这一步如果A需要AOP,就生成代理对象,如果不需要就是普通对象),这个时候B就可以使用早期A对象
然后B继续往后走流程,这个时候B可能也需要AOP,那么B也会同样使用lambda表达式去完成这一步,然后放入二级缓存,然后B完成创建再放入三级缓存。
这个时候B创建完成,回到A里面,因为B已经完成,所以A里面的B填充成功,这个时候A继续往下走,当要AOP的时候发现二级缓存里面有,直接跳过AOP环节
将A从二级缓存放入三级缓存,这样循环依赖就解决了。
标签:BeanPostProcessor,缓存,里面,SpringBoot,SpringMVC,创建,对象,二级缓存,三级 From: https://www.cnblogs.com/orangeJuiceRain/p/17222989.html