測試**如下:
建立乙個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...