當(dāng)前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring5源码 - 09 循环依赖解读
生活随笔
收集整理的這篇文章主要介紹了
Spring5源码 - 09 循环依赖解读
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 什么是循環(huán)依賴
- 模擬循環(huán)依賴的問題
- Spring 的循環(huán)依賴解決方案(三級緩存)
什么是循環(huán)依賴
舉個簡單的例子
A 依賴 B,B 又依賴 A,它們之間形成了循環(huán)依賴。
或者是 A 依賴 B,B 依賴 C,C 又依賴 A,同樣的 也是循環(huán)依賴
模擬循環(huán)依賴的問題
package com.artisan.cycleDepend;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;@Component public class A {@Autowiredprivate B b;@PostConstructpublic void init(){System.out.println("A");} } import javax.annotation.PostConstruct;@Component public class B {@Autowiredprivate A a ;@PostConstructpublic void init(){System.out.println("A");} }【測試代碼】
package com.artisan.cycleDepend;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.RootBeanDefinition;import java.lang.reflect.Field; import java.util.Map; import java.util.concurrent.ConcurrentHashMap;/*** 模擬循環(huán)依賴的問題*/ public class CycleDependTest {private static Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>();// 一級緩存private static Map<String, Object> singletonObjects = new ConcurrentHashMap<>();public static void main(String[] args) throws InstantiationException, IllegalAccessException {// 模擬Spring 的 解析對象為 BeanDefinition 并放到 BeanDefinitionMap中RootBeanDefinition a = new RootBeanDefinition(A.class);RootBeanDefinition b = new RootBeanDefinition(B.class);beanDefinitionMap.put("a",a);beanDefinitionMap.put("b",b);// 模擬Spring 的 getBean 循環(huán)創(chuàng)建Beanfor (String beanName : beanDefinitionMap.keySet()){getBean(beanName);}}public static Object getBean(String beanName) throws IllegalAccessException, InstantiationException {// 實例化RootBeanDefinition beanDefinition = (RootBeanDefinition) beanDefinitionMap.get(beanName);Class<?> beanClass = beanDefinition.getBeanClass();Object o = beanClass.newInstance();// 屬性填充// 獲取聲明的字段Field[] declaredFields = o.getClass().getDeclaredFields();// 遍歷for (Field declaredField : declaredFields) {// 檢查是否有Autowired注解Autowired annotation = declaredField.getAnnotation(Autowired.class);if (annotation != null){// private屬性 需要設(shè)置為truedeclaredField.setAccessible(true);// 獲取屬性的名字String name = declaredField.getName();// 遞歸調(diào)用getBean獲取實例Object bean = getBean(name);// 字段設(shè)置屬性declaredField.set(o,bean);}}// 初始化 init-method 。。。。// 存入一級緩存singletonObjects.put(beanName,o);return o;} }【運行結(jié)果】
分析下原因
Spring 的循環(huán)依賴解決方案(三級緩存)
總結(jié)
以上是生活随笔為你收集整理的Spring5源码 - 09 循环依赖解读的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring5源码 - 08 BeanF
- 下一篇: Shell - 监控某个进程的内存占用情