一、循環依賴注入問題
Singleton類型的做用域,能夠在早期對象緩存集合中或者查詢是否存在正在建立中的bean來解決循環依賴注入問題。
private final Map<String,Object> earlySingletonObjects = new HashMap<String,Object>(16);
二、IOC容器的工做模式,經過工廠模式根據beanName經過反射動態生成對象。
1)IOC容器主要完成對象的建立和依賴的管理注入等。
2)依賴注入是控制反轉的基礎。
3)利用反射原理將對象建立的權利交給了Spring容器,Spring在運行的時候根據配置文件來動態建立對象和維護對象之間的關係,實現了鬆耦合。
三、依賴注入的實現方式
:構造器、Setter方法注入、接口注入(經常使用,@Autowired,@Resource)
由Spring容器將對象注入到使用它的地方,被注入的對象只提供對應的方法接收就行,由容器來決定對象之間的依賴關係。
四、@Autowired原理
1)每一個Bean實例化以後,調用AutowiredAnnotationBeanPostProcessor的下圖方法,找到有@Autowired註解的信息。
檢查beanName在injectionMetadataCache的Map中是否有對應的元數據,若不存在則從新經過反射綁定元數據LinkedList。Synchronized線程同步方式。靜態的方法或類,字段不支持@Autowired。
2)
AutowiredAnnotationBeanPostProcessor的postProcessPropertyValues()方法就是從Spring IOC容器從找到合適的Bean,注入屬性。找到合適的Bean,注入@Autowired標識方法的參數,而後執行此方法。
3)第二步中metadata.inject(bean,beanName,pvs);即以下圖:
解析@Autowired註解生成的元數據類有AutowiredFieldElement,AutowiredMethodElement;這兩個類繼承InjectionMetadata,InjectedElement,各自實現了inject方法。這兩個類是AutowiredAnnotationBeanPostProcessor的內部靜態私有類。
檢查方法或屬性是不是公開的,若不是,則強制轉爲可訪問的,避免與JVM發生沒必要要的衝突。
ReflectionUtils.makeAccessible(field);
ReflectionUtils.makeAccessible(method);
四、接下來就須要Spring IOC容器根據DependencyDescriptor依賴描述去尋找容器中合適的Bean。
五、@Autowired註解能夠在Map,Array,Collection中使用。