IOC
IOC將對象的創建,依賴關系的管理和生命周期的控制從應用程序代碼中解耦出來了
IOC容器的依賴注入(DI)
在程序運行過程中動態的向某個對象中注入他所需要的其他對象
依賴注入是基于反射實現的
Spring IOC 容器使用的是Map(concorrentMap)來存儲Bean(Object)
概念
IOC,就是控制反轉,也被稱為依賴注入
在 Spring沒出現之前,當一個對象需要使用其他對象來完成某些操作,就需要我們自己去創建或查找這些依賴的對象。
現在,有了 Spring,我們的對象交給 Spring管理,這些對象可以理解為存放在一個容器中的,這個容器就稱為 Spring IoC 容器。在 IoC 容器中,對象不再自己管理它們的依賴,而是通過構造方法參數、工廠方法的參數或者在對象創建后通過屬性設置來定義它們的依賴關系。
Spring的 IoC 容器負責在創建對象時注入它們依賴的其他對象,也就是自動地把依賴的對象提供給需要它們的對象。這樣一來,對象不再需要主動去查找或創建它們的依賴,而是由容器在創建對象時幫助它們完成依賴注入的過程。
控制反轉的概念主要是與傳統的直接構造(即 new 操作)來控制對象依賴的方式相反。傳統方式中,一個對象通常會直接創建或查找它所依賴的其他對象,而在 IoC 中,對象將自身的控制權交給了容器,容器負責管理對象的創建和依賴注入,因此被稱為「控制反轉」。
Bean
Bean生命周期的四個階段
Bean循環依賴
-
通過field屬性注入循環依賴(也就是注解@Autowired),IOC容器可能會解決掉
-
通過構造器注入循環依賴,IOC容器不會解決掉
Spring解決循環依賴
使用三級緩存解決循環依賴
-
第一級緩存:緩存的是已經實例化,屬性注入,初始化的Bean對象(功能完備的bean)
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
-
第二級緩存:緩存的是實例化之后沒有完成屬性注入,初始化的Bean對象(也就是new出來沒有填充依賴屬性的bean) 意義:提前暴露Bean,讓其他的Bean知道這個Bean存在于IOC之中
private final Map<String, Object> earlySingletonObjects = new HashMap<16>;
-
第三級緩存:生成原始對象進行AOP操作后的代理對象
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);