spring原始碼之bean包

2021-08-31 09:52:34 字數 4642 閱讀 5988

測試**如下:

建立乙個teacher類:

public class teacher 

public void setdescription(string description)

}

在包下建立乙個spring.xml

在<?xml version="1.0" encoding="utf-8"?>

測試**:

@suppresswarnings("deprecation")

public class beanfactorytest

}

以上是乙個很簡單的spring的bean託管案例。那麼他是怎麼實現的呢?以下是spring載入的順序

public xmlbeanfactory(resource resource, beanfactory parentbeanfactory) throws bean***ception
執行xmlbeandefinitionreader的loadbeandefinitions()方法來解析配置檔案並生成bean。

第三步:解析+註冊(以下**省略部分異常捕獲)

protected int doloadbeandefinitions(inputsource inputsource, resource resource) 

return count;

}

此方法的實現類為:defaultdocumentloader

使用的sax解析

@override

public document loaddocument(inputsource inputsource, entityresolver entityresolver,

errorhandler errorhandler, int validationmode, boolean namespaceaware) throws exception

documentbuilder builder = createdocumentbuilder(factory, entityresolver, errorhandler);

return builder.parse(inputsource);

}

public int registerbeandefinitions(document doc, resource resource) throws beandefinitionstoreexception
@suppresswarnings("deprecation")  // for environment.acceptsprofiles(string...)

protected void doregisterbeandefinitions(element root)

return;}}

} //解析前處理(模板方法),使用者可重寫此方法,來實現解析前記錄部分資訊

preprocessxml(root);

//解析方法

parsebeandefinitions(root, this.delegate);

//解析後處理

postprocessxml(root);

this.delegate = parent;

}

protected void parsebeandefinitions(element root, beandefinitionparserdelegate delegate) 

else }}

} else

}

private void parsedefaultelement(element ele, beandefinitionparserdelegate delegate) 

//alias標籤的處理

else if (delegate.nodenameequals(ele, alias_element))

//對bean標籤的處理

else if (delegate.nodenameequals(ele, bean_element))

//對beans標籤的處理

else if (delegate.nodenameequals(ele, nested_beans_element))

}

以下先介紹bean的具體解析及註冊:

protected void processbeandefinition(element ele, beandefinitionparserdelegate delegate) 

catch (beandefinitionstoreexception ex)

// send registration event.

//通知相關的***,這個bean已經載入成功(使用者可自定義***)

getreadercontext().firecomponentregistered(new beancomponentdefinition(bdholder));

} }

public beandefinitionholder parsebeandefinitionelement(element ele, @nullable beandefinition containingbean)

string beanname = id;

if (!stringutils.hastext(beanname) && !aliases.isempty())

}if (containingbean == null)

//解析獲取bean的屬性,包括parent,property等子元素

abstractbeandefinition beandefinition = parsebeandefinitionelement(ele, beanname, containingbean);

if (beandefinition != null) else

}if (logger.istraceenabled())

} catch (exception ex)

}string aliasesarray = stringutils.tostringarray(aliases);

return new beandefinitionholder(beandefinition, beanname, aliasesarray);

}return null;

}最後,解析和裝飾都已經完成,該註冊了。

讓我們回到processbeandefinition(element ele, beandefinitionparserdelegate delegate)這個方法

beandefinitionreaderutils.registerbeandefinition(bdholder,getreadercontext().getregistry());進行註冊。

對於bean的註冊,我們可以理解為spring將解析出來的beandefinition放入map集合之中,不過除此之類,spring還做了大量的驗證以及高併發處理。**如下

public static void registerbeandefinition(

beandefinitionholder definitionholder, beandefinitionregistry registry)

throws beandefinitionstoreexception

} }

@override

public void registerbeandefinition(string beanname, beandefinition beandefinition)

throws beandefinitionstoreexception

catch (beandefinitionvalidationexception ex)

} beandefinition existingdefinition = this.beandefinitionmap.get(beanname);

if (existingdefinition != null)

else if (existingdefinition.getrole() < beandefinition.getrole())

}else if (!beandefinition.equals(existingdefinition))

}else

}this.beandefinitionmap.put(beanname, beandefinition);

} else }}

else

this.frozenbeandefinitionnames = null;

} if (existingdefinition != null || containssingleton(beanname))

}

至此,spring的解析與註冊結束了。

Spring原始碼之 Bean註解解析

spring bean是乙個方法級別的註解,用於產生乙個被spring ioc容器所管理的bean。通常情況下,bean可以與 configuration和 component註解一起使用 configuration和 component是方法級別的註解 在預設情況下 bean註解所產生的bean是...

Spring原始碼解讀之bean注入依賴

在應用開發中 以應用開發人員的身份訪問設計元件時候,往往需要引用 或者呼叫其他組建的服務,這種依賴關係如果固定在元件設計中就會造成 依賴關係的僵化和維護難度的增加。在 spring 中通過ioc 容器把資源的獲取方 向反轉,讓 ioc容器住的管理這些依賴關係,將這些關係注入到元件中,那麼會讓這些依賴...

spring原始碼 bean之增強初始化 3

四 可能有人會問,為什麼沒有defaultlistablebeanfactory的相關屬性了呢,這個在原始碼的講解部分會細說。五 原始碼解析 1 增強性的bean容器初始化實現方式 public static void main string args 2 實現過程 bean ception bea...