推广网站免费,上海企业营销策划,做海报挣钱的网站,wordpress主题源文件假设在spring中bean A依赖bean B#xff0c;bean B依赖bean A#xff0c;这种循环依赖的情况通常会使用三级缓存的方式进行处理。
什么是三级缓存
一级缓存#xff1a;存储的是已经实例化完成的bean实例。 二级缓存#xff1a;存放在这里的是提前暴露的bean半成品。若Bea…假设在spring中bean A依赖bean Bbean B依赖bean A这种循环依赖的情况通常会使用三级缓存的方式进行处理。
什么是三级缓存
一级缓存存储的是已经实例化完成的bean实例。 二级缓存存放在这里的是提前暴露的bean半成品。若Bean需AOP代理如Async、Transactional三级缓存的ObjectFactory会提前生成代理对象并存入二级缓存避免重复创建代理。 三级缓存存放的是bean的ObjectFactory对象通过ObjectFactory.getObject()可以获取具体的bean实例。
如何进行循环依赖处理
spring会按以下步骤进行处理
spring调用构造化方法实例化bean A同时把A的ObjectFactory存入三级缓存。发现A依赖bean B后会先在一级缓存查询是否已经有bean B的实例如果没有会在二级缓存查询如还是没有会在三级缓存查询B的ObjectFactory。如三级缓存都没有则bean A会暂停注入属性先去实例化bean B。B实例化后同样会把ObjectFactory存入三级缓存。B在注入属性时发现依赖bean A此时B同样会从一级缓存到三级缓存依次查询。查询到实例后进行属性注入。bean B属性注入完成后bean A恢复注入流程从三级缓存中查询对应的ObjectFactory。 循环依赖处理过程如下图所示 #mermaid-svg-AdCXZrChVIlgseU1 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-AdCXZrChVIlgseU1 .error-icon{fill:#552222;}#mermaid-svg-AdCXZrChVIlgseU1 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-AdCXZrChVIlgseU1 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-AdCXZrChVIlgseU1 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-AdCXZrChVIlgseU1 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-AdCXZrChVIlgseU1 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-AdCXZrChVIlgseU1 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-AdCXZrChVIlgseU1 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-AdCXZrChVIlgseU1 .marker.cross{stroke:#333333;}#mermaid-svg-AdCXZrChVIlgseU1 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-AdCXZrChVIlgseU1 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-AdCXZrChVIlgseU1 text.actortspan{fill:black;stroke:none;}#mermaid-svg-AdCXZrChVIlgseU1 .actor-line{stroke:grey;}#mermaid-svg-AdCXZrChVIlgseU1 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-AdCXZrChVIlgseU1 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-AdCXZrChVIlgseU1 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-AdCXZrChVIlgseU1 .sequenceNumber{fill:white;}#mermaid-svg-AdCXZrChVIlgseU1 #sequencenumber{fill:#333;}#mermaid-svg-AdCXZrChVIlgseU1 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-AdCXZrChVIlgseU1 .messageText{fill:#333;stroke:#333;}#mermaid-svg-AdCXZrChVIlgseU1 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-AdCXZrChVIlgseU1 .labelText,#mermaid-svg-AdCXZrChVIlgseU1 .labelTexttspan{fill:black;stroke:none;}#mermaid-svg-AdCXZrChVIlgseU1 .loopText,#mermaid-svg-AdCXZrChVIlgseU1 .loopTexttspan{fill:black;stroke:none;}#mermaid-svg-AdCXZrChVIlgseU1 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-AdCXZrChVIlgseU1 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-AdCXZrChVIlgseU1 .noteText,#mermaid-svg-AdCXZrChVIlgseU1 .noteTexttspan{fill:black;stroke:none;}#mermaid-svg-AdCXZrChVIlgseU1 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-AdCXZrChVIlgseU1 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-AdCXZrChVIlgseU1 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-AdCXZrChVIlgseU1 .actorPopupMenu{position:absolute;}#mermaid-svg-AdCXZrChVIlgseU1 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-AdCXZrChVIlgseU1 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-AdCXZrChVIlgseU1 .actor-man circle,#mermaid-svg-AdCXZrChVIlgseU1 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-AdCXZrChVIlgseU1 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Container A B Cache ObjectFactory 1. 实例化A 2. 注册A的ObjectFactory到三级缓存 3. 开始注入属性(发现需要B) 4. 实例化B 5. 注册B的ObjectFactory到三级缓存 6. 开始注入属性(发现需要A) 7. 请求A的引用 8. 调用getObject() 9. 执行getEarlyBeanReference() 10. 返回原始对象或代理 11. 返回A的早期引用 12. 完成B的初始化 13. 完成A的初始化 Container A B Cache ObjectFactory