Spring ioc底層原始碼初見

2021-09-20 13:17:34 字數 2294 閱讀 2825

ioc成為依賴注入(di),是乙個物件定義依賴關係的過程,物件只通過構造函式引數,工廠方法的引數或物件例項構造或工廠方法返回在物件例項上設定的屬性來定義它們所使用的其他物件,然後容器在建立bean時注入這些依賴項,這個過程本質是bean本身的逆過程,因此稱為控制反轉(ioc)

aliasregistry別名註冊器 bean的name作為key ,

extendbeandefinitionregistry

beandefinitionregistrybean定義註冊器 concurrenthashmap

bean的id作為key 註冊到容器中

beandefinitionbean定義 承載bean屬性(scope init-method)

beanfactorybean工廠 beandefinition交給工廠 beandefinitionregistry

getbean(name) 找到beandefinition建立例項

簡單ioc底層bean生產過程

defaultlistablebeanfactory registry = new defaultlistablebeanfactory();

beandefinition definition = new rootbeandefinition(serviceimpl.class);

registry.registerbeandefinition("service", definition);

system.out.println(registry.getbeandefinition("service"));

system.out.println(registry.getbean("service"));

方法

beandefinition.setautowiremode(num)
不傳入構造方法時,用無參構造為優先選擇

num=1

構造時,用構造器的方法名字為優先選擇

num=2

構造時,用構造器傳入的引數為優先選擇

num=3

構造時,用構造器傳入的引數數量多為優先選擇(貪婪構造模式)

xml配置檔案配置的bean

在建立beanfactory的過程中注入容器

註解方式的bean,在隨後呼叫invokebeanfactorypostprocessors(引用beanfactory後置方法)中註冊bean

abstractbeanfactory --> dogetbean #bean工廠 建立 bean

#建立前從singletonobjects(快取) 中獲取單例,如果快取中沒有,對單例是不是正在建立進行判斷(如果正在建立, – > 放入earlysingletonobject)(解決相互呼叫的迴圈依賴問題),最後建立新的bean。 建立後,將newsingleton置為true,然後通過addsingleton,用singletonobject.put放入單例對向池。

defaultsingletonbeanregistry – > getsingleton

abstractautowirecapablebeanfactory – > creatbeaninstance

反射原理,動態建立物件。

(通過 beanfactory,

setter方法

無參構造器) – > 對autowire的構造器進行判斷,1 2 3模式。

#初始化bean 呼叫init方法

abstractautowirecapablebeanfactory --> initializebean

tis: 由此見,可以通過實現initializingbean介面,來完成自定義初始化方法。

#beanfactory和factorybean的邏輯

最終bean 通過abstractbeanfactory – > getobjectforbeaninstance 返回

(不是factorybean直接返回普通的bean物件)

!(beaninstance instanceof factorybean)

||beanfactoryutils.insfactorydereference(name) -->

name傳入進行判斷,

name.startswith(beanfactory.factory_bean_prefix)

"beanfactory.factory_bean_prefix == 『&』』

含義:name前面加個『&』,返回beanfactory物件。

ArrayList底層原始碼

arraylist的屬性 private static final int default capacity 10 預設初始容量的大小 private static final object empty elementdata 空陣列,用於有參構造時引數為零的例項 private static fi...

Spring IoC底層原理

siwuxie095 spring ioc 底層原理 1 ioc 即 inversion of control,控制反轉,把物件的建立 交給 spring 進行管理 2 ioc 容器管理 bean 的方式 1 基於 配置檔案的方式 2 基於 註解的方式 3 ioc 底層原理所使用的技術 1 xml ...

SpringIOC底層原理

一 建立xml配置檔案 預設為單例項 userdao class com.example.ioc.userdao userdao 以上僅為示例,具體寫 時定義一次bean即可。二 建立工廠類,解析配置檔案 public static object getbean string id 解析xml檔案 ...