javascript
Spring IOC-BeanFactory的继承体系结构
本文主要介紹BeanFactory以及它的各種繼承層級(jí)的接口、抽象類及實(shí)現(xiàn)類,因?yàn)閮?nèi)容很多,所以這里不介紹ApplicationContext繼承體系下的類(雖然ApplicationContext本質(zhì)上也是BeanFactory,但是畢竟這這是我們平時(shí)接觸最多的兩種類別,所以分開說(shuō))。
關(guān)于ApplicationContext繼承體系結(jié)構(gòu)在《Spring IOC-ApplicationContext的繼承體系結(jié)構(gòu)》一文分享說(shuō)明。
BeanFactory其實(shí)就是Spring的IOC容器,當(dāng)然了Spring為我們準(zhǔn)備了許多種IOC容器來(lái)使用,這樣可以方便我們從不同的層面,不同的資源位置,不同的形式的定義信息來(lái)建立我們需要的IoC容器。
在鄙人博客的不同的博文中其實(shí)都提到了Spring的一個(gè)設(shè)計(jì)理念,就是接口-抽象類-實(shí)現(xiàn)類的體系結(jié)構(gòu),這里多說(shuō)幾句為什么這么設(shè)計(jì),熟悉設(shè)計(jì)模式的人都知道,這樣的目的是為了提高軟件的可維護(hù)性、可擴(kuò)展性、強(qiáng)復(fù)用性。說(shuō)的文雅一點(diǎn)就是使代碼滿足“對(duì)修改關(guān)閉、對(duì)擴(kuò)展開放”、“里氏代換”原則 、“依賴倒轉(zhuǎn)”原則、“接口隔離”原則、“合成\聚合復(fù)用”原則。如果項(xiàng)了解這幾個(gè)原則可以百度下,這里不詳細(xì)介紹。
廢話不多說(shuō),直接上代碼來(lái)看下BeanFactory的繼承道理多屌。
先貼張圖,大家大致看下知道下面介紹的類大概在繼承體系的哪個(gè)位置。
首先看BeanFactory接口中定義的方法:
然后在看BeanFactory 的直接繼承接口(二級(jí)接口),有HierarchicalBeanFactory、AutowireCapableBeanFactory和ListableBeanFactory看這三個(gè)類代碼:
HierarchicalBeanFactory
作用:是為了實(shí)現(xiàn)bean工廠的層級(jí)關(guān)系提供支持,其中聲明兩個(gè)方法:
AutowireCapableBeanFactory
作用:提供自動(dòng)裝配bean能力的功能支持,聲明方法如下:(這個(gè)接口中所有聲明的方法都是在默認(rèn)的實(shí)現(xiàn)實(shí)在AbstractAutowireCapableBeanFactory類中默認(rèn)實(shí)現(xiàn))
ListableBeanFactory
作用:可以枚舉所有的bean實(shí)例,是為了使客戶端訪問工廠中的bean而設(shè)計(jì)的,主要方法(這些方法顧名思義,所有的方法實(shí)現(xiàn)在StaticListableBeanFactory、AbstractApplicationContext和DefaultListableBeanFactory中):
下面我們介紹BeanFactory 的三級(jí)接口,看繼承關(guān)系圖知道是ConfigurableBeanFactory和ConfigurableListableBeanFactory。
ConfigurableBeanFactory
作用: 實(shí)現(xiàn)可配置的bean的環(huán)境功能,這個(gè)接口繼承自HierarchicalBeanFactory所以支持層級(jí)關(guān)系的工廠,和SingletonBeanRegistry所以肯定支持單例工廠行為,看主要方法代碼(在AbstractBeanFactory類中默認(rèn)實(shí)現(xiàn)):
ConfigurableListableBeanFactory
作用:提供可配置的、可訪問的功能,接口中的方法在在DefaultListableBeanFactory默認(rèn)實(shí)現(xiàn)默認(rèn)實(shí)現(xiàn)。
上面是接口的繼承體系和說(shuō)明,下面來(lái)介紹接口下抽象類的代碼,在上面的介紹中我們知道就兩個(gè)抽象類AbstractAutowireCapableBeanFactory和AbstractBeanFactory,先看繼承關(guān)系:
public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactoryimplements AutowireCapableBeanFactory { public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {可以知道AbstractAutowireCapableBeanFactory 是AbstractBeanFactory 類的子類。通過(guò)上面的接口和抽象類的介紹我們將研究的重點(diǎn)轉(zhuǎn)到轉(zhuǎn)到這兩個(gè)抽象類中。
這里我們主要看bean工廠是怎么將xml中的定義信息轉(zhuǎn)換為互相依賴的bean定義或者初始化為實(shí)體對(duì)象。
先看在繼承體系偏上的類AbstractBeanFactory ,這個(gè)類最重要的是對(duì)BeanFactory中g(shù)etBean()的實(shí)現(xiàn),直接看實(shí)現(xiàn)的代碼:
在看doGetBean()方法代碼:
……………… //首先從單例工廠得到有沒有 Object sharedInstance = getSingleton(beanName); if (sharedInstance != null && args == null) {bean = getObjectForBeanInstance(sharedInstance, name, beanName, null); } //不是但單例的 else {//看是不是在父BeanFactory ,因?yàn)閷?shí)現(xiàn)了HierarchicalBeanFactory接口BeanFactory parentBeanFactory = getParentBeanFactory();if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {return parentBeanFactory.getBean(nameToLookup, requiredType);} ……………………if (mbd.isSingleton()) {//單例的//用回調(diào)的形式建造bean并且放入單例工廠sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {public Object getObject() throws BeansException {try {return createBean(beanName, mbd, args);}……………………//多例的else if (mbd.isPrototype()) {Object prototypeInstance = null;beforePrototypeCreation(beanName);prototypeInstance = createBean(beanName, mbd, args);………………else {//沒有明確是單例的還是不是,有自己的作用域scopeString scopeName = mbd.getScope();final Scope scope = this.scopes.get(scopeName);Object scopedInstance = scope.get(beanName, new ObjectFactory<Object>() {public Object getObject() throws BeansException { return createBean(beanName, mbd, args);……………………可以上面是分為三種情況得到bean的,單例的、多例的、Scope的。但是所有的情況最終都定位到一個(gè)方法——createBean(beanName, mbd, args),這個(gè)方法在AbstractBeanFactory 是抽象的protected abstract Object createBean(,很明顯,只能在子類中實(shí)現(xiàn),自然就要看AbstractAutowireCapableBeanFactory 中的建造bean的createBean()代碼:
protected Object createBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)throws BeanCreationException {………………//如果沒有找到這個(gè)name的class類型是會(huì)拋出異常的resolveBeanClass(mbd, beanName);//判斷在xml中定義的overrides方法存在mbd.prepareMethodOverrides();………………//用bean的前處理器去實(shí)例化Object bean = resolveBeforeInstantiation(beanName, mbd);………………Object beanInstance = doCreateBean(beanName, mbd, args);………………好的,代碼定位到**doCreateBean(beanName, mbd, args)**方法:
//逐漸的構(gòu)造一個(gè)bean,分別用factory method, and autowiring a constructor.去構(gòu)造,這些都是在xml中配置的。 protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) {………………instanceWrapper = createBeanInstance(beanName, mbd, args);………………//構(gòu)造bean并且注入依賴所有bean的屬性值Object exposedObject = bean;try {populateBean(beanName, mbd, instanceWrapper);if (exposedObject != null) {//調(diào)用配置的init方法exposedObject = initializeBean(beanName, exposedObject, mbd);} }代碼定位到createBeanInstance(beanName, mbd, args)
//用 factory method, constructor autowiring, or simple instantiation.三種方法去實(shí)例化一個(gè)bean protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) {………………//用getFactoryMethodName去實(shí)例化一個(gè)if (mbd.getFactoryMethodName() != null) {return instantiateUsingFactoryMethod(beanName, mbd, args);}………………//用構(gòu)造函數(shù)if (autowireNecessary) {return autowireConstructor(beanName, mbd, null, null);}else {//用默認(rèn)的構(gòu)造函數(shù)得到return instantiateBean(beanName, mbd);}……………… }再定位代碼到populateBean(beanName, mbd, instanceWrapper):
//主要是bean中的成員變量的初始化和注入,《依賴的注入》 protected void populateBean(String beanName, AbstractBeanDefinition mbd, BeanWrapper bw) {……………………if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME || mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) { MutablePropertyValues newPvs = new MutablePropertyValues(pvs); // Add property values based on autowire by name if applicable. if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) { autowireByName(beanName, mbd, bw, newPvs); } // Add property values based on autowire by type if applicable. if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) { autowireByType(beanName, mbd, bw, newPvs); } pvs = newPvs; } ……………………//將屬性的引用和具體的對(duì)象結(jié)合起來(lái),用到了java的反射機(jī)制applyPropertyValues(beanName, mbd, bw, pvs); }最后是applyPropertyValues(beanName, mbd, bw, pvs)
protected void applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs) {try {//調(diào)用BeanWrapper類的方法bw.setPropertyValues(new MutablePropertyValues(deepCopy));}這里補(bǔ)充一下BeanWrapperImpl類中設(shè)置屬性依賴的代碼實(shí)現(xiàn):
……………… //如果有key屬性配置,證明是array list 或者map if (tokens.keys != null) {if (propValue.getClass().isArray()) {else if (propValue instanceof List) {else if (propValue instanceof Map) { } //普通的屬性設(shè)置 else{………………writeMethod.setAccessible(true);writeMethod.invoke(object, value); } ………………至此bean的如何初始化和如何進(jìn)行依賴注入就已經(jīng)研究代碼完畢。
下面也是最后我們看一下這個(gè)繼承體系中具體類XmlBeanFactory、DefaultListableBeanFactory的實(shí)現(xiàn)代碼:
XmlBeanFactory
關(guān)于XmlBeanFactory加載xml,會(huì)在Spring IOC-XmlBeanFactory如何加載xml及如何存儲(chǔ)轉(zhuǎn)換后的信息一文介紹。
DefaultListableBeanFactory
是XmlBeanFactory的父類,也就是而你看下文章最前面的繼承圖,你會(huì)發(fā)現(xiàn)DefaultListableBeanFactory擁有這個(gè)繼承體系中的所有功能。
那么除了繼承父類的功能方法外,它獨(dú)特的功能在于對(duì)ConfigurableListableBeanFactory和ListableBeanFactory接口的實(shí)現(xiàn)。
總結(jié)
以上是生活随笔為你收集整理的Spring IOC-BeanFactory的继承体系结构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021-06-09使用IAR软件进行T
- 下一篇: ThreeJS阴影