1. 程式人生 > >Spring框架之beans原始碼完全解析

Spring框架之beans原始碼完全解析

導讀:Spring可以說是Java企業開發裡最重要的技術。而Spring兩大核心IOC(Inversion of Control控制反轉)和AOP(Aspect Oriented Programming面向切面程式設計)其中又以IOC最為核心。IOC容器是Spring的核心模組,Spring提供了兩種型別的容器,一個是BeanFactory,一個是ApplicationContext,而ApplicationContext是BeanFactory擴充套件來的。

本文就Spring框架的beans原始碼進行解析,主要從以下幾個方面進行:一是Spring框架介紹,對Spring整體架構有個直觀的瞭解;二是對beans原始碼檔案清單進行梳理,共12大類,257個java檔案,對DefaultListableBeanFactory等一些核心類進行了重點分析;三是對BeanDefinition進行解析,BeanDefinition 在 spring 中貫穿始終,是spring 一塊基石;四是對Bean預設標籤解析全過程進行了分析;五是以doGetBean函式為核心,分析Bean的載入過程;六是介紹ApplicationContext和BeanFactory兩種容器的Bean的生命週期。


文章目錄

一、Spring框架簡介

二、Beans原始碼檔案清單

  1、  org.springframework.beans包含的類和介面

  2、  org.springframework.beans.annotation包含的類和介面

  3、  org.springframework.beans.propertyeditors包含的類和介面

  4、  org.springframework.beans.support包含的類和介面

  5、  org.springframework.beans.factory包含的類和介面

  6、  org.springframework.beans.factory.annotation包含的類和介面

  7、  org.springframework.beans.factory.config包含的類和介面

  8、  org.springframework.beans.factory.parsing包含的類和介面

  9、  org.springframework.beans.factory.serviceloader包含的類和介面

  10、org.springframework.beans.factory.support包含的類和介面

  11、org.springframework.beans.factory.wiring包含的類和介面

  12、org.springframework.beans.factory.xml包含的類和介面

三、BeanDefinition解析

  (一)BeanDefinition是什麼

  (二)BeanDefinition屬性

  (三)BeanDefinition實現類

  (四)BeanDefinition的載入和解析

四、Bean預設標籤解析

  (一)預設標籤

  (二)bean標籤的解析及註冊

  (三)解析BeanDefinition

  (四)建立用於承載屬性的GenericBeanDefinition

  (五)解析各種屬性

五、Bean的載入

  (1)轉換對應的beanName

  (2)嘗試從快取中載入單例

  (3)bean的例項化

  (4)原型模式(prototype)的依賴檢查

  (5)檢測parentBeanFactory

  (6)GenericBeanDefinition轉為RootBeanDefinition

  (7)尋找依賴

  (8)依據scope建立bean

  (9)型別轉換

六、Bean的生命週期

  (1)ApplicationContext Bean生命週期

  (2)BeanFactory Bean生命週期

 

一、Spring框架簡介

  Spring框架是一個Java平臺,用來提供全面的基礎設施支援開發Java應用程式, Spring負責處理基礎設施部分,這樣你就可以專注於應用程式部分。Spring框架內,把一級物件通過設計模式封裝起來,這樣你就可以整合到自己的應用程式中而不用關注他們是如何在後臺工作的。

  目前,Spring框架按照功能組織成大約20個模組。這些模組分為核心容器、資料訪問/整合、Web、AOP(面向切面的程式設計)、instrument(支援和類載入器的實現來在特定的應用伺服器上使用)、訊息和測試,如下圖所示。

從上面可以看出Spring主要分成六個模組:

  1.Spring核心容器:核心容器是Spring框架的重要組成部分,也可以說是Spring框架的基礎。他在整個框架中的作用是負責管理物件的建立,管理,配置等操作。其主要包含spring-core、spring-beans、spring-context、spring-expression元件。

  2.面向切面程式設計:Spring框架還提供了面向切面程式設計的能力,利用面向切面程式設計,可以實現一些面向物件程式設計無法很好實現的操作。例如,將日誌,事務與具體的業務邏輯解耦。其主要包含spring-aop、spring-aspects元件。

  3.Instrumentation:該模組提供了為JVM新增代理的功能,該模組包含spring-instrument、spring-instrument-tomcat元件,使用較少,不必過分關注。

  4.資料訪問與整合:Spring框架為了簡化資料訪問的操作,包裝了很多關於資料訪問的操作,提供了相應的模板。同時還提供了使用ORM框架的能力,可以與很多流行的ORM框架進行整合,如hibernate,mybatis等等的著名框架。還實現了資料事務的能力,能夠支援事務。包含spring-jdbc、spring-tx、spring-orm、spring-oxm、spring-jms、spring-messaging元件。

  5.Web和遠端呼叫:Spring框架支援Web開發,以及與其他應用遠端互動呼叫的方案。包含spring-web、spring-webmvc、spring-websocket、spring-webmvc-portlet元件。

  6.Spring測試:Spring框架提供了測試的模組,可以實現單元測試,整合測試等等的測試流程,整合了JUnit或者TestNG測試框架。包含spring-test元件。

 

我們為什麼要使用Spring框架?簡單來說,使用Spring框架可以帶來以下好處:

  1、輕量:非入侵性的、所依賴的東西少、資源佔用少、部署簡單,不同功能選擇不同的 jar 組合。

  2、容器:工廠模式實現對 JavaBean 進行管理,通過控制反轉(IOC)將應用程式的配置和依賴性與應用程式碼分開。

  3、鬆耦合:通過 xml 配置或註解即可完成 bean 的依賴注入。

  4、AOP:通過 xml 配置 或註解即可加入面向切面程式設計的能力,完成切面功能,如日誌,事務等的統一處理。

  5、方便整合:通過配置和簡單的物件注入即可整合其他框架,如 Mybatis、Hibernate。

  6、豐富的功能:JDBC層抽象、事務管理、MVC、Java Mail、任務排程、JMX、JMS、JNDI、EJB、動態語言、遠端訪問、Web Service等。

 

其中,最核心的就是上述的2和4:IOC(控制反轉)和AOP(面向切面程式設計)。

  IOC:在平時的java應用開發中,我們要實現某一個功能或者說是完成某個業務邏輯時至少需要兩個或以上的物件來協作完成。在沒有使用Spring的時候,每個物件在需要使用他的合作物件時,自己均要使用像new object() 這樣的語法來將合作物件創建出來,這個合作物件是由自己主動創建出來的,建立合作物件的主動權在自己手上,自己需要哪個合作物件,就主動去建立,建立合作物件的主動權和建立時機是由自己把控的,而這樣就會使得物件間的耦合度高了。比如A物件需要使用合作物件B來共同完成一件事,A要使用B,那麼A就對B產生了依賴,也就是A和B之間存在一種耦合關係,並且是緊密耦合在一起。而使用了Spring之後就不一樣了,建立合作物件B的工作是由Spring來做的,Spring建立好B物件,然後儲存到一個容器裡面,當A物件需要使用B物件時,Spring就從存放物件的那個容器裡面取出那個B物件,然後交給A物件使用,至於Spring是如何建立那個物件,以及什麼時候建立好,A物件不需要關心這些細節問題,A得到Spring給之後,兩個物件一起協作完成要完成的工作即可。

  所以控制反轉是將建立物件的控制權進行轉移,以前建立物件的主動權和建立時機是由自己把控的,而現在這種權力轉移到第三方,比如轉移交給了IOC容器,它就是一個專門用來建立物件的工廠,你要什麼物件,它就給你什麼物件,有了 IOC容器,依賴關係就變了,原先的依賴關係就沒了,它們都依賴IOC容器了,通過IOC容器來建立它們之間的關係。

  AOP可以說是OOP(Object Oriented Programming,面向物件程式設計)的補充和完善。OOP引入封裝、繼承、多型等概念來建立一種物件層次結構,用於模擬公共行為的一個集合。不過OOP允許開發者定義縱向的關係,但並不適合定義橫向的關係,例如日誌功能。日誌程式碼往往橫向地散佈在所有物件層次中,而與它對應的物件的核心功能毫無關係對於其他型別的程式碼,如安全性、異常處理和透明的持續性也都是如此,這種散佈在各處的無關的程式碼被稱為橫切,在OOP設計中,它導致了大量程式碼的重複,而不利於各個模組的重用。

  同OOP技術恰恰相反,AOP利用一種稱為"橫切"的技術,剖解開封裝的物件內部,並將那些影響了多個類的公共行為封裝到一個可重用模組,並將其命名為"Aspect",即切面。所謂"切面",簡單說就是那些與業務無關,卻為業務模組所共同呼叫的邏輯或責任封裝起來,便於減少系統的重複程式碼,降低模組之間的耦合度,並有利於未來的可操作性和可維護性。

 

二、Beans原始碼檔案清單

  spring專案原始碼由多個子專案組成,如spring-beans,spring-context,spring-core,spring-aop,spring-web,spring-webmvc等,整個專案結構如下圖:

其中spring beans有如下的原始檔包:

  1、org.springframework.beans:包含了操作java bean的介面和類。

  2、org.springframework.beans.annotation:支援包,提供對java 5註解處理bean樣式的支援。

  3、org.springframework.beans.propertyeditors:屬性編輯器,用來將string型別的值轉換為object型別。

  4、org.springframework.beans.support:org.springframework.beans的支援包,比如一組bean的排序和保持工具類等。

  5、org.springframework.beans.factory:實現spring輕量級IOC容器的核心包。

  6、org.springframework.beans.factory.annotation:配置基於註解驅動的bean的支援包。

  7、org.springframework.beans.factory.config:bean工廠的SPI介面和配置相關的處理類。

  8、org.springframework.beans.factory.parsing:bean definition解析的支援基礎類。

  9、org.springframework.beans.factory.serviceloader:jdk1.6 ServiceLoader基礎類的支援包。

  10、org.springframework.beans.factory.support:org.springframework.beans.factory 包的支援類。

  11、org.springframework.beans.factory.wiring:一種決定一個bean例項的元資料的機制。

  12、org.springframework.beans.factory.xml:包含了一個基於xml的beanFactory實現,也包含一個標準的spring-beans的dtd。

 

  在介紹beans的類和介面之前,先理清下bean的概念,在 Spring 中,構成應用程式主幹並由Spring IOC容器管理的物件稱為bean。bean是一個由Spring IOC容器例項化、組裝和管理的物件。簡而言之,bean是物件,而且由Spring中IOC容器進行管理,我們的應用程式由一個個bean構成。

1、org.springframework.beans包含的類和介面

1.1  BeanInfoFactory:建立java.beans.BeanInfo例項的策略,定義了方法BeanInfo getBeanInfo()。

1.2 ExtendedBeanInfo:BeanInfo介面的實現類,BeanInfo介面是在java.beans包中的。

1.3 ExtendedBeanInfoFactory:BeanInfoFactory介面的實現,用來評估bean的class是否有不滿足JavaBean規範的set方法,因而是否滿足Spring ExtendedBeanInfo作為內省的候選。

 

1.4 BeanWrapper:Spring底層JavaBean公共基礎的核心介面。通常不直接使用,而是通過BeanFactory間接使用。作用:提供對標準javabean的分析和操作方法:單個或者批量獲取和設定屬性值,獲取屬性描述符,查詢屬性的可讀性和可寫性等。支援屬性的巢狀設定,深度沒有限制。

1.5 CachedIntrospectionResults:內部類。在BeanWrapperImpl類中會用到,為這個類的javabean快取屬性描述資訊,以提高效率,減小開銷。

1.6 BeanWrapperImpl:BeanWrapper的預設實現。可以根據需求,將集合與陣列的值轉換到對應目標物件的集合和陣列。自定義的屬性編輯器通過屬性編輯器的setValue,setAsText方法實現上述的轉換功能。

 

1.7 Mergeable:代表一個物件的值可以和父物件的值進行合併的介面。其主要的子類有:ManagedList、ManagedArray、ManagedMap、ManagedProperties、ManagedSet。這幾個類在org.springframework.beans.factory 包中。

1.8 BeanMetadataElement:傳送配置源物件的超級介面。定義了唯一的方法:Object getSource(),其子類和子介面如下圖:


1.9 BeanMetadataAttribute:bean definition定義中的屬性-鍵值對(key-value)容器。

1.10 BeanMetadataAttributeAccessor:AttributeAccessorSupport的拓展,為了追蹤物件定義源。

 

1.11 GenericTypeAwarePropertyDescriptor:JavaBeans的PropertyDescriptor類的拓展,過載了getPropertyType函式。

1.12 PropertyDescriptorUtils:抽象類,PropertyDescriptor內部使用。PropertyDescriptor(屬性描述器)在軟體包 java.beans中,用來表示JavaBean 通過儲存器方法匯出的一個屬性。

1.13 PropertyMatches:根據一個可配置的距離計算一個屬性的匹配度。可同時用於java bean的成員變數(fields)與屬性(properties)。其核心函式calculateStringDistance,利用Levenshtein演算法計算兩個字串的相似度。另解析下Java中成員變數(Fields)和屬性(Properties)的區別: 成員變數Fields就是定義的欄位。根據SUN官方定義,屬性是指get或者set方法名去掉get或者set後,把剩餘的部分首字母改為小寫後,即為這個類的屬性。

1.14 PropertyAccessor:獲取和設定屬性(例如物件bean的屬性,物件的Field)的通用介面,它用來作為BeanWrapper的基礎介面。其繼承關係如下圖:

1.15  AbstractPropertyAccessor:PropertyAccessor介面的抽象實現。

1.16  AbstractNestablePropertyAccessor:繼承自AbstractPropertyAccessor,也是ConfigurablePropertyAccessor的一種,可以為典型的一些應用場景提供支援。

1.17 ConfigurablePropertyAccessor:PropertyAccessor配置方法的封裝介面。是BeanWrapper的父介面。

1.18 DirectFieldAccessor:ConfigurablePropertyAccessor介面的實現類,用來直接獲取例項的欄位(f ield)。

1.19 PropertyAccessorFactory:獲取PropertyAccessor例項簡單工廠,特別是BeanWrapper例項(BeanWrapper繼承自PropertyAccessor)。

1.20 PropertyAccessorUtils:PropertyAccessor類獲取和設定屬性的一些工具方法。

 

1.21 PropertyEditorRegistrar:用一個屬性編輯器註冊器(PropertyEditorRegistry)註冊一個自定義的屬性編輯器(PropertyEditor)的策略介面。

1.22 PropertyEditorRegistry:屬性編輯器註冊器。封裝了JavaBean屬性編輯器的註冊方法。主要函式為void registerCustomEditor()。

1.23 PropertyEditorRegistrySupport:PropertyEditorRegistry介面的基本實現類。主要作為BeanWrapperImpl父類使用。

 

1.24 PropertyValue:一個物件,用來儲存一個bean單獨屬性值資訊。用物件來儲存PropertyValue(name, value)資訊,相對於map儲存可以提供更大的靈活性。

1.25 PropertyValues:包含了一個或者多個PropertyValue物件,通常用作特定的一個目的bean的屬性更新。

1.26 MutablePropertyValues:PropertyValues介面的預設實現,提供了對屬性的一些簡單操作,比如get、add、set、merge、remove方法等。

1.27 PropertyValuesEditor:PropertyValues 物件的編輯器。

 

1.28 TypeConverter:定義了型別轉換方法的介面。將值轉換成指定的型別。

1.29 TypeConverterDelegate:內部用的類,用來將屬性值轉換為目標型別的值。

1.30 SimpleTypeConverter:TypeConverter介面的簡單實現,它不會針對一個特定的目標進行操作。

1.31 TypeConverterSupport:TypeConverter介面的基本實現類,使用了代理typeConverterDelegate。這個類主要用作BeanWrapperImpl的基類使用。

 

1.32 BeanUtils:JavaBeans的靜態工具方法,用來初始化bean,檢查bean屬性型別,複製bean屬性等。

 

1.33 BeansException:在beans包和子包中所丟擲的所有異常的抽象超類。

1.34 BeanInstantiationException:bean初始化失敗時丟擲的異常。

1.35 FatalBeanException:在bean包和子包中遇到的不可恢復問題丟擲的異常,例如:當引用一個無效的bean屬性時丟擲的InvalidPropertyException異常。

1.36 ConversionNotSupportedException:當一個bean的屬性沒有適合的編輯器或者轉換器時所丟擲的異常。

1.37 MethodInvocationException:當一個bean屬性的get和set方法丟擲異常時丟擲該異常,類似於InvocationTargetException。

1.38 NullValueInNestedPathException:當獲取一個內嵌屬性路徑的屬性時遇到空指標異常時丟擲的異常。

1.39 TypeMismatchException:當試圖設定bean屬性時丟擲的型別不匹配異常。

1.40 InvalidPropertyException:遇到非法的bean property時異常類。

1.41 NotReadablePropertyException:當試圖獲取一個不可讀屬性的屬性值時丟擲的異常,典型場景bean屬性沒有get方法。

1.42 NotWritablePropertyException:當試圖向一個不可寫屬性寫入屬性值時丟擲的異常,典型場景bean屬性沒有set方法。.

1.43 PropertyAccessException:獲取屬性相關的異常超類,例如型別不匹配或者目標呼叫異常。

1.44 PropertyBatchUpdateException組合異常,由多個的單個PropertyAccessException例項組成。

 

2、org.springframework.beans.annotation包含的介面和類

2.1 AnnotationBeanUtils:JavaBean型別註解的通用工具方法。定義了一個靜態方法:public static void copyPropertiesToBean(),將指定Annotation的屬性複製到目標bean中。如果屬性在excludeProperties中定義了,那麼就不會被複制。

 

3、org.springframework.beans.propertyeditors包含的介面和類

  屬性編輯器,用來將string型別的值轉換成object型別的。他們都繼承自PropertyEditorSupport,這個類可以用於自定義的型別轉換,繼承後重寫了public void setAsText(),public String getAsText() 兩個方法。注意PropertyEditor和PropertyEditorSupport都是java自己定義的,不是Spring的。包含的類有:

3.1  ByteArrayPropertyEditor

3.2  CharacterEditor

3.3  CharArrayPropertyEditor

3.4  CharArrayPropertyEditor

3.5  ClassArrayEditor

3.6  ClassEditor

3.7  CurrencyEditor

3.8  CustomBooleanEditor

3.9  CustomCollectionEditor

3.10  CustomDateEditor

3.11  CustomMapEditor

3.12  CustomNumberEditor

3.13  FileEditor

3.14  InputSourceEditor

3.15  InputStreamEditor

3.16  LocaleEditor

3.17  PathEditor

3.18  PatternEditor

3.19  PropertiesEditor

3.20  ReaderEditor

3.21  ResourceBundleEditor

3.22  StringArrayPropertyEditor

3.23 StringTrimmerEditor

3.24  StringTrimmerEditor

3.25  URIEditor

3.25  URLEditor

3.27  UUIDEditor

3.28  ZoneIdEditor

 

4、org.springframework.beans.support包含的介面和類

4.1  ArgumentConvertingMethodInvoker:MethodInvoker的子類,通過TypeConverter將真實目標方法的指定引數進行轉換。

4.2  MutableSortDefinition:SortDefinition介面的可變實現。支援在對同一個屬性值進行設定的時候可以利用升序排列的值進行切換。

4.3  PagedListHolder:PagedListHolder是一個簡單的狀態保持,它處理一組物件,將它們分頁。分頁的起始頁從0開始。主要用在web網站的使用者介面上。

4.4  PropertyComparator:對兩個bean進行比較,通過BeanWrapper來比較指定bean的屬性。

4.5  ResourceEditorRegistrar:繼承了PropertyEditorRegistrar,使用資源編輯器來填充指定的PropertyEditorRegistry。

4.6  SortDefinition:根據一個指定的屬性對一組bean例項進行排序的定義類。isAscending為True時進行升序排列,為False進行降序排列。

 

5、org.springframework.beans.factory包含的介面和類

5.1  Aware:它是一個標籤,內部沒有任何屬性或者方法。它是一個超級介面,實現它的子介面的bean標誌著在spring容器中可以被特定框架的物件通知到,通過回撥方式的方法來完成這種通知。繼承關係如下圖:

5.2  BeanClassLoaderAware:允許一個獲取它的classLoader(即當前bean factory載入bean類使用的class loader)的回撥類,實現了void setBeanClassLoader(ClassLoader classLoader)。

5.3  BeanFactoryAware:實現此介面的bean可以獲取到它們自己的Beanfactory。比如,bean可以通過factory尋找一些具有協作關係的beans。

5.4  BeanNameAware:實現此介面的bean可以在一個bean factory中獲取到它們的bean名稱。但是需要注意的是,並不推薦一個通過一個bean name去定位bean,在外部配置中,這種對應關係並不嚴格對應。

5.5  NamedBean:對應BeanNameAware介面,返回bean的名稱。函式String getBeanName()。

 

5.6  BeanFactory:獲取spring bean容器的根介面。其主要函式有getBean()、getBeanProvider()、containsBean()、isSingleton()、isPrototype()、isTypeMatch()、getType()、getAliases()。其繼承關係如下圖:

5.7  BeanFactoryUtils:beanFactory上的操作方法工具類,特別是在ListableBeanFactory介面上。包括返回bean的個數,bean的名字,bean例項等,考慮到了一些具有巢狀關係的hierarchy factory,而如果這些方法在ListableBeanFactory中不需要考慮這些。

5.8  HierarchicalBeanFactory:子介面,實現此介面的bean factory具有層次結構即可以獲取父BeanFactory。方法 getParentBeanFactory()獲取父BeanFactory;方法containsLocalBean()判斷本地bean factory是否含有指定名字的bean,不考慮在父BeanFactory中的情況。

5.9  ListableBeanFactory:beanFactory介面的實現,實現此介面的beanFactory能遍歷他們內部的所有bean例項,而不用根據客戶請求通過名字一個一個的去搜索bean。提供的函式如下:

  containsBeanDefinition();判斷factory是否包含指定命名的bean definition;

  getBeanDefinitionCount();返回在factory中定義的bean的個數;

  getBeanDefinitionNames();返回該factory中定義的所有bean的名字;

  getBeanNamesForType();返回指定型別的bean的名字;

  getBeansOfType();返回指定型別的bean例項;

  getBeanNamesForAnnotation(); 返回被指定的標籤標註的所有bean的名字;

  getBeansWithAnnotation();返回被指定標籤標註的所有bean例項。

 

5.10  FactoryBean:實現了此介面的bean不能看做一個通常意義上的bean,一個FactoryBean雖然以bean的形式來定義,但它暴露的物件(getObject())通常是它建立的物件,而不是作為一個bean例項暴露自己。

5.11  SmartFactoryBean:FactoryBean介面的擴充套件實現。實現該介面可以表明每次是否返回的都是獨立的例項,因為用isSingleton()函式判斷為假,表明非單例模式,但這並不足以表明返回的都是獨立的例項。

 

5.12  ObjectFactory:一個物件工廠,當觸發時會返回所有物件的例項(可以是共享的或者獨立的)。

5.13  ObjectProvider:繼承自ObjectFactory,ObjectFactory的一個變種,專門用來為注入點服務。

5.14  InjectionPoint:注入點的簡單描述,指向一個方法或者建構函式的引數或者成員變數(field)。

5.15  InitializingBean:實現此介面的bean在BeanFactory設定為它們的屬性時只需要執行一次,例如:初始化定製或者僅僅檢查必須存在的屬性是否已經設定完成等等。

5.16  SmartInitializingSingleton:回撥介面,當一個bean工廠建立時,單例singleton例項化階段結束時被觸發。一些單例模式的bean可以實現此介面,在單例例項做完一些規律性、常做的初始化可以用來做一些初始化工作。以避免突發的Early initialization產生的負面效果。比如ListableBeanFactory中的getBeansOfType函式呼叫。注:對於單件的初始化有(Lazy Initialization)和(Early initialization)兩種方法。

5.17  BeanCreationException:beanfactory在試圖通過bean definition建立一個bean時遇到錯誤而丟擲的異常。

5.18  BeanCreationNotAllowedException:若當前不允許建立一個bean時(例如在beanFactory關閉過程中)而試圖去獲取bean的請求時丟擲的異常。

5.19  BeanCurrentlyInCreationException:一個bean的引用當前正在建立過程中丟擲的異常。

5.20  BeanDefinitionStoreException:beanFactory遇到一個無效的bean definition丟擲的異常 。

5.21  BeanExpressionException:獲取一個表示式的值失敗時丟擲的異常。

5.22  BeanInitializationException:bean初始化異常時丟擲。

5.23  BeanIsAbstractException:當試圖獲取一個定義為abstract的bean definition時丟擲的異常。

5.24  BeanIsNotAFactoryException:當一個bean不是工廠,但使用者試圖通過給定bean名稱訪問工廠。

5.25  BeanNotOfRequiredTypeException:當一個bean的型別和期望型別不匹配時丟擲的異常。

5.26  CannotLoadBeanClassException:BeanFactory不能載入指定bean的class類時丟擲的異常。

5.27  FactoryBeanNotInitializedException:工廠bean沒有初始化異常。

5.28  NoSuchBeanDefinitionException:沒有該bean definition異常。

5.29 NoUniqueBeanDefinitionException:返回多個bean definition異常。

5.30  UnsatisfiedDependencyException:當有依賴檢查時,在bean factory定義中,bean的依賴或者屬性沒有指定時丟擲的異常。

 

6、org.springframework.beans.factory.annotation包含的介面和類

6.1  AnnotatedBeanDefinition:BeanDefinition介面的擴充套件,BeanDefinition在org.springframework. beans.factory.config包中。

  它暴露了它的bean 類的AnnotationMetadata,不需要載入類。提供了一個getMetadata()方法來獲取該bean definition的註解元資料, ClassMetadata定義了一個特定類的抽象元資料,不需要載入此類即可訪問,主要方法有:

  1)String getClassName()返回該類的名稱。

  2)boolean isInterface()返回該類是否是介面。

  3)boolean isAbstract()返回該類是否為抽象類。

  4)boolean isConcrete()返回該類是否為具體類。

  5)boolean isFinal()返回該類是否為final類。

  6)boolean hasSuperClass()返回該類是否有父類。

  7)String getSuperClassName()返回父類的名稱,沒有的話返回null。

  8)String[] getInterfaceNames()返回繼承的介面陣列,如果沒有,返回空。

  9)String[] getMemberClassNames()返回引用的類的名稱。

6.2  AnnotatedGenericBeanDefinition:繼承自GernericBeanDefinition和AnnotatedBeanDefinition,通過暴露AnnotatedBeanDefinition介面來增加對註解元資料的支援。GernericBeanDefinition在org.springframework.beans.factory.support包中,是一站式的標準bean Definition。

 

Spring自帶依賴注入註解:

  1 @Required:依賴檢查;

  2 @Autowired:按型別自動裝配,用於替代基於XML配置的自動裝配。基於@Autowired的自動裝配,預設是根據型別注入,可以用於構造器、欄位、方法注入

  3 @Value:注入int、float、String等基本資料型別,只能標註在成員變數、setter方法上。

  4 @Qualifier:限定描述符,用於細粒度選擇候選者。@Qualifier限定描述符除了能根據名字進行注入,但能進行更細粒度的控制如何選擇候選者。@Qualifier(value = "限定識別符號")

 

6.3  Required:public @interface Required 依賴檢查。

6.4  Autowired:public @interface Autowired:可以對成員變數、方法和建構函式進行標註,來完成自動裝配的工作。

6.5  Value:public @interface Value:用於注入SpEL表示式,可以放置在欄位方法或引數上。

6.6  Qualifier:@Qualifier(value = "限定識別符號") 。對應於基於XML配置中的標籤,@Qualifier限定描述符除了能根據名字進行注入,但能進行更細粒度的控制如何選擇候選者@Qualifier(value = "限定識別符號") 。

6.7  Configurable:@Configurable 註解中的autowire屬性就可以讓Spring來自動裝配。

 

6.8  RequiredAnnotationBeanPostProcessor(@required註解實現類):實現了BeanPostProcessor,對配置了Required註解的javaBean屬性進行強制檢查。

6.9  AutowiredAnnotationBeanPostProcessor (Autowired註解實現類):實現了BeanPostProcessor介面,它自動繫結註解的field,setter方法和任意配置方法。AutowiredAnnotationBeanPostProcessor 間接繼承了BeanPostProcessor,它自動繫結註解的field,setter方法和任意的配置方法。當檢測到5個java註解時這些成員被注入其中。spring預設的註解為@Autowired和@Value。另外:也支援JSR-330的@inject註解,作為@Autowired的替代方案。

6.10  AnnotationBeanWiringInfoResolver(@configurable註解實現):繼承自BeanWiringInfoResolver,使用configurable的註解來查詢哪些類需要自動繫結。設定 @Configurable 註解中的autowire屬性就可以讓Spring來自動裝配:@Configurable(autowire= Autowire.BY_TYPE) 或者 @Configurable(autowire=Autowire.BY_NAME,這樣就可以按型別或者按名字自動裝配了。

6.11  QualifierAnnotationAutowireCandidateResolver(@qualifier的註解實現類):間接實現了AutowireCandidateResolver,對要自動繫結的field或者引數和bean definition根據@qualifier註解進行匹配。同時也支援通過@value註解來繫結表示式的值。AutowireCandidateResolver是一個策略介面,由它來決定特定的bean definition對特定的依賴是否可以作為一個自動繫結的候選項。

6.12  InitDestroyAnnotationBeanPostProcessor(初始化和銷燬方法的註解實現類):間接繼承了BeanPostProcessor,實現了通過註解來初始化init和銷燬destroy方法。是spring的InitializingBean和DisposableBean回撥介面的註解實現。

 

6.13  BeanFactoryAnnotationUtils:關聯註解的bean的查詢的工具方法,例如spring的@Qualifier註解。

6.14  CustomAutowireConfigurer:繼承了BeanFactoryPostProcessor,它使自定義的自動繫結qualifier型別的註冊更便利。.

6.15  InjectionMetadata:管理注入元資料的內部類。

6.16  Lookup:@Lookup的註解,這是一個作用在方法上的註解,被其標註的方法會被重寫,然後根據其返回值的型別,容器呼叫BeanFactory的getBean()方法來返回一個bean。

比如:如果有一個類C,需要用到類B,如果使用@Autowired註解注入B,那麼B每次呼叫都是同一個物件,即使B不是單例的,現在我希望每次呼叫B都是不一樣的,那麼實現方案有2個:方案A : 每次從容器中獲取B;方案B: 使用@lookup註解。

6.17  ParameterResolutionDelegate:代理類,用來解析外部建構函式或方法上的自動裝配的引數。

6.18 Autowire:決定自動繫結狀態的列舉,即一個bean的依賴是否由spring容器使用setter方式自動注入。這個是spring DI的核心概念。

 

7、org.springframework.beans.factory.config包含的介面和類

FactoryBean和BeanFactory區別:

  FactoryBean:Spring 中有兩種型別的Bean,一種是普通Bean,另一種是工廠Bean 即 FactoryBean。FactoryBean跟普通Bean不同,其返回的物件不是指定類的一個例項,而是該FactoryBean的getObject方法所返回的物件。創建出來的物件是否屬於單例由isSingleton中的返回決定。Spring自身就提供了70多個FactoryBean的實現。它們隱藏了例項化一些複雜Bean的細節,給上層應用帶來了便利。FactoryBean 通常是用來建立比較複雜的bean,一般的bean 直接用xml配置即可,但如果一個bean的建立過程中涉及到很多其他的bean 和複雜的邏輯,用xml配置比較困難,這時可以考慮用FactoryBean。

  BeanFactory:以Factory結尾,表示它是一個工廠類(介面), 是負責生產和管理bean的一個工廠。在Spring中,BeanFactory是IOC容器的核心介面,它的職責包括:例項化、定位、配置應用程式中的物件及建立這些物件間的依賴。BeanFactory只是個介面,並不是IOC容器的具體實現,但是Spring容器給出了很多種實現,如 DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等。

 

7.1  AbstractFactoryBean:實現了FactoryBean的簡單模板超類,它根據singleton標誌來決定是建立一個單例還是一個prototype物件。

7.2  ListFactoryBean:共享一組(list)例項的簡單工廠bean。

7.3  MapFactoryBean:共享一組(map)例項的簡單工廠bean。

7.4  SetFactoryBean:共享set例項的簡單工廠bean。

7.5  MethodInvokingFactoryBean:一個有返回值的工廠bean,它返回觸發一個靜態或者例項的方法的結果。

7.6  MethodInvokingBean:一個簡單的method invoker bean,和MethodInvokingFactoryBean不同,它並不返回觸發一個方法的結果,而是僅僅返回觸發一個目標方法。

7.7  FieldRetrievingFactoryBean:檢索靜態或者非靜態Field的值的工廠bean。

7.8  PropertyPathFactoryBean:通過給定目標物件計算屬性路徑的工廠bean。

7.9  ObjectFactoryCreatingFactoryBean:一個有返回值的工廠bean,它返回ObjectFactory。

7.10  ProviderCreatingFactoryBean:返回一個JSR-330 Provider的工廠bean,JSR-330 Provider反過來從beanFactory返回一個bean資源。JSR-330 是 Java 的依賴注入標準。

7.11  ServiceLocatorFactoryBean:繼承自FactoryBean,在beanFactory中建立一個動態代理,來代理一個具有一個或者多個服務或者型別的介面。

7.12  PropertiesFactoryBean:它支援從classpath位置的檔案中讀取屬性例項的工廠bean。

7.13  YamlMapFactoryBean:為讀取YAML原始檔的Map的工廠,保持YAML宣告的值型別和結構的原樣。

7.14  YamlProcessor:YAML 是專門用來寫配置檔案的語言,非常簡潔和強大,遠比 JSON 格式方便。它實質上是一種通用的資料序列化格式。該類作為YAML factories基類。

7.15  YamlPropertiesFactoryBean:從YAML原始檔中讀取屬性的工廠,用來暴露字串屬性值扁平型組織結構。

 

7.16  AutowireCapableBeanFactory:beanFactory的擴充套件介面,實現了自動繫結功能。這個介面的兩個主要方法是:autowire:使用給定的自動繫結策略,來給一個類的新例項進行初始化。autowireBeanProperties使用名稱或者型別來自動繫結給定bean例項的屬性。

7.17  ConfigurableBeanFactory:將會被大部分beanFactory實現的配置介面。為對bean factory進行配置提供一些功能服務,包括BeanFactory介面中的一些函式。這個介面並不用於普通的應用程式碼,而是用於同BeanFactory或 ListableBeanFactory一起出現使用。

7.18  ConfigurableListableBeanFactory:將會被大部分ListablebeanFactory實現的配置介面。除了ConfigurableBeanFactory,該介面也提供分析和修改bean definitions的功能函式,也能預例項化單例物件。

       

7.19  BeanDefinition:一個bean例項的描述,它含有屬性值、構造引數值。它的實現子類還提供更多的資訊。bean的定義BeanDefinition,包裝BeanWrapper是java bean的基礎。可以這麼說,是spring的基石,再怎麼強調它的重要性都不為過。

  BeanDefinition 作用:一個BeanDefinition描述了一個bean的例項,包括屬性值,構造方法引數值和繼承自它的類的更多資訊。BeanDefinition僅僅是一個最簡單的介面,主要功能是允許BeanFactoryPostProcessor,例如PropertyPlaceHolderConfigure(PropertyPlaceholderConfigurer是BeanFactoryPostProcessor的一個重要實現)能夠檢索並修改屬性值和別的bean的元資料。

  BeanDefinition的繼承關係:(1)父介面:AttributeAccessor、BeanMetadataElement。其中,AttributeAccessor介面定義了最基本的對任意物件的元資料的修改或者獲取,BeanMetadataElement介面提供了一個getResource()方法,用來傳輸一個可配置的源物件。(2)子介面:AnnotatedBeanDefinition。(3)子類: AbstractBeanDefinition、AnnotatedGenericBeanDefinition、ChildBeanDefinition、GenericBeanDefinition、RootBeanDefinition、ScannedGenericBeanDefinition。

7.20  BeanDefinitionCustomizer:定製一個給定的bean definition的回撥函式,用在Lambda 表示式或者方法引用中。

7.21  BeanDefinitionHolder:使用名稱或者別名來儲存BeanDefinition。可以為內部bean作為佔位符註冊。

7.22  BeanDefinitionVisitor:遍歷BeanDefinition物件的參觀者類,特別是也遍歷bean中的屬性值和構造引數值,解析bean的元資料值。在PlaceholderConfigurerSupport中被使用,用來解析包含在BeanDefinition中所有的字串值,解析發現的所有佔位符。

 

7.23  BeanPostProcessor:允許對一個新的bean例項進行定製修改的工廠鉤子。

7.24  BeanFactoryPostProcessor:允許對一個applicationContext中的bean definition進行定製修改的工廠鉤子,修改context內含的bean factory中bean的屬性值。

7.25  DestructionAwareBeanPostProcessor:BeanPostProcessor的子介面,它增加了一個銷燬前回調方法。

7.26  InstantiationAwareBeanPostProcessor:BeanPostProcessor的子介面,它增加了一個初始化前回調方法,還有一個在初始化後但顯式設定屬性或者自動繫結發生前的回撥方法。

7.27  InstantiationAwareBeanPostProcessorAdapter:實現了SmartInstantiationAwareBeanPostProcessor所有方法的介面卡,它沒有任何操作,不會改變容器對bean進行初始化的處理過程。

7.28  SmartInstantiationAwareBeanPostProcessor:InstantiationAwareBeanPostProcessor的擴充套件介面,它增加了對一個處理過bean的最終型別進行預測的回撥方法。

 

7.29  CustomEditorConfigurer:繼承自BeanFactoryPostProcessor,給自定義屬性編輯器的註冊提供了便利的方法。

7.30  CustomScopeConfigurer:BeanFactoryPostProcessor的簡單實現,給自定義Scope的註冊提供了便利的方法,上面提到ConfigurableBeanFactory提供了Scope的註冊。

7.31  PreferencesPlaceholderConfigurer:PropertyPlaceholderConfigurer的子類,支援JDK1.4中的Preferences API (java.util.prefs)

7.32  PropertyOverrideConfigurer:屬性資源配置器,它支援在applicationContext中重寫一個bean的屬性值。

7.33  PropertyPlaceholderConfigurer:PlaceholderConfigurerSupport的子類,它解析本地屬性或者系統屬性或者環境變數定義的佔位符(以${}描述)。

7.34  PropertyResourceConfigurer:支援從一個屬性資源中對單個bean的屬性值進行配置。

 

7.35  BeanExpressionContext:計算一個BeanDefinition內部的表示式的容器物件。

7.36  BeanExpressionResolver:通過計算一個表示式來解析為值的策略介面。

7.37  EmbeddedValueResolver:StringValueResolver介面卡,用於解析ConfigurableBeanFactory佔位符和表示式。

7.38  BeanReference:暴露bean名稱的引用介面。這個介面並不需要實際指向一個bean例項,只需要邏輯指向bean的名字。

7.39  RuntimeBeanNameReference:固定佔位符類,當在beanfactory中作為另外一個bean名稱的引用時,作為屬性值物件,將在執行時進行解析。

7.40  RuntimeBeanReference:固定佔位符類,當在beanfactory中作為另外一個bean的引用時,作為屬性值物件,將在執行時進行解析。

7.41  TypedStringValue:儲存一個型別的屬性值。

7.42  ConstructorArgumentValues:儲存構造方法的引數值,特別是作為Beandefinition的一部分。

7.43  DependencyDescriptor:將要注入的特定依賴的描述。

7.44  DeprecatedBeanWarner:繼承自BeanFactoryPostProcessor,記錄@Deprecated bean的報警資訊。

7.45  PlaceholderConfigurerSupport:屬性資源配置器的抽象基類,它解析BeanDefinition中屬性值的佔位符。

7.46  AutowiredPropertyMarker:簡單的標記類,用於自動裝載屬性值,增加到BeanDefinition的getPropertyValues()函式為一個指定的bean 屬性。

 

7.47  NamedBeanHolder:給定名字的bean例項的簡單佔位符。

7.48  SingletonBeanRegistry:定義了共享bean例項的註冊介面。

7.49  Scope:ConfigurableBeanFactory使用的策略介面,代表了bean例項所在的作用域。Bean的作用域就是指Bean例項的生存空間或者有效範圍。scope=[singleton, prototype, request, session, global session]

  1、singleton(單例項):在每個Spring IOC容器中,一個Bean定義對應一個物件例項。這是Spring容器預設的作用域。當一個Bean的作用域為Singleton時,Spring IOC容器中只會存在一個共享的Bean例項,並且所有對Bean的請求,只要id與該Bean定義相匹配,就只會返回Bean的同一個例項。這個單一例項會被儲存到單例快取(Singleton Cache)中,並且所有針對該Bean的後續請求和引用都將返回被快取的物件例項。單例項模式對於無會話狀態的Bean(DAO元件、業務邏輯元件)來說是理想的選擇。

  2、prototype(原型模式):一個bean定義對應多個物件例項。prototype作用域的Bean在每次對該Bean請求時都會建立一個新的Bean例項,對需要保持會話狀態的Bean(Struts2中充當控制器的Action類)應該使用prototype作用域。spring不能對一個原型模式Bean的整個生命週期負責,容器在初始化、裝配好一個原型模式例項後,將它交給客戶端,就不再過問了。因此,客戶端要負責原型模式例項的生命週期管理。

  3、request:在一次Http請求中,容器會返回該Bean的同一個例項,而對於不同的使用者請求,會返回不同的例項。該作用域僅在基於Web的Spring ApplicationContext情形下有效。

  4、session:在一次HttpSession中,容器會返回該Bean的同一個例項。而對於不同的HttpSession請求,會返回不同的例項。該作用域僅在基於Web的Spring ApplicationContext情形下有效。

  5、global session:在全域性的HTTPSession中,容器會返回該Bean的同一個例項。僅在使用portlet context時有效。

 

8、org.springframework.beans.factory.parsing包含的介面和類

8.1  AbstractComponentDefinition:ComponentDefinition介面的基本實現,提供了getDescription()來代理ComponentDefinition.getName()方法。

8.2  BeanComponentDefinition:基於一個標準BeanDefinition的ComponentDefinition,暴露指定bean的指定beanDefinition,內部BeanDefinition和BeanReference。

8.3  ComponentDefinition:描述在同一配置的Context中一組BeanDefinition和BeanReference的邏輯檢視的介面。

8.4  CompositeComponentDefinition:儲存了一個或者多個內嵌ComponentDefinition例項的ComponentDefinition實現,它把這些ComponentDefinition例項聚合成具有命名的組。

8.5  AliasDefinition:代表在解析程序中一個別名已經被註冊。

8.6  ImportDefinition:在解析程序中,代表一個import已經被處理。

8.7  DefaultsDefinition:一個預設definition標識介面,繼承了BeanMetadataElement,沒有實現任何方法。

 

8.8  ConstructorArgumentEntry:代表了構造引數。

8.9  BeanEntry:代表了一個BeanDefinition。

8.10  PropertyEntry:代表了一個javaBean的屬性。

8.11  QualifierEntry:代表了一個自動繫結的備選qualifier。

 

8.12  EmptyReaderEventListener:ReaderEventListener介面的空實現,所有回撥方法都沒有提供可執行操作。

8.13  ReaderEventListener:接受在讀取BeanDefinition程序中註冊元件、別名、import時的回撥介面。

 

8.14  FailFastProblemReporter:ProblemReporter介面的簡單實現,當遇到錯誤發生時展示fail-fast行為。

8.15  ProblemReporter:SPI介面,支援tool或者外部程序處理在beanDefinition解析期間報出的錯誤或者異常。

 

8.16  PassThroughSourceExtractor:SourceExtractor的簡單實現,它通過一個attachment來傳遞備選的源資料型別物件。

8.17  NullSourceExtractor:SourceExtractor介面的簡單實現,返回null作為source元資料。

8.18  SourceExtractor:簡單策略介面,允許工具控制source元資料關聯到bean definition元資料。

 

8.19  Location:模型介面,一個資源位置的模型。

8.20  ParseState:在解析程序中作為一個簡單的基於棧結構的追蹤邏輯位置類。

8.21  Problem:代表了一個beanDefinition配置問題。

8.22  ReaderContext:bean definition讀取程序中傳遞的一個Context,封裝了所有相關的配置,包括狀態。

8.23  BeanDefinitionParsingException:一個bean definition驗證失敗時丟擲異常的異常類。

 

9、org.springframework.beans.factory.serviceloader包含的介面和類

9.1  AbstractServiceLoaderBasedFactoryBean:FactoryBean的抽象基類,它是操作JDK1.6 ServiceLoader的基礎工具。

9.2  ServiceFactoryBean:暴露指定配置的服務類的基礎服務的FactoryBean,通過JDK1.6 serviceLoader基礎類來獲取這些服務。

9.3  ServiceListFactoryBean:暴露配置的服務類的所有基礎服務的FactoryBea,表現為一組服務物件,可以通過JDK1.6 serviceLoader基礎類來獲取這些服務。

9.4  ServiceLoaderFactoryBean:暴露指定配置服務類的JDK1.6 serviceLoader的FactoryBean。

10、org.springframework.beans.factory.support包含的介面和類

10.1  DefaultListableBeanFactory:是beans包中最核心的一個類,ListableBeanFactory介面和BeanDefinitionRegistry介面的預設實現:基於beanDefinition物件的一個成熟的beanFactory。BeanDefinitionRegistry(在此包中)提供了beanDefinition的管理。AbstractAutowireCapableBeanFactory(在此包中)實現屬性的自動繫結功能。ConfigurableListableBeanFactory(在org.springframework.beans.factory.config包中)提供了對bean定義的分析和修改的便利方法,同時也提供了對單例的預例項化。

  Serializable介面是Java提供的序列化介面,是一個空介面,為物件提供標準的序列化和反序列化操作。它的原始碼是public interface Serializable{},即什麼都沒有,是一個標識介面。在Java中的這個Serializable介面是給JVM看的,告訴JVM,我不做這個類的序列化了,你(JVM)給我序列化。當我們讓實體類實現此介面,其實是告訴JVM此類可以被序列化,可被預設的序列化機制序列化。那什麼是序列化,作用是什麼?序列化就是將一個物件及其狀態轉換成位元組碼,儲存起來(可以儲存在資料庫、記憶體、檔案等),然後可以在適當的時候再將其狀態恢復(也就是反序列化)。有兩個應用場景:一是想把記憶體中的物件狀態儲存到一個檔案或者資料庫中,二是想將物件通過網路進行傳輸的時候。

  DefaultListableBeanFactory是通過實現上述4個特定的功能的介面、抽象類來完成的,是一個成熟的bean factory。spring IOC容器的實現,從根源上是beanfactory,但真正可以作為一個獨立使用的IOC容器還是DefaultListableBeanFactory,因此可以說DefaultListableBeanFactory是整個spring IOC的始祖。它可以作為一個單獨的BeanFactory,也可作為自定義BeanFactory的父類。其繼承關係如下圖:

  (1)類入口處提供了一個靜態方法:

javaxInjectProviderClass=ClassUtils.forName("javax.inject.Provider",DefaultListableBeanFactory.class.getClassLoader());

  ClassUtils(在包org.springframework.util裡)提供了對類的實用方法,主要用在框架內部。這個靜態方法返回了javax.inject.Provider的一個例項。  包 javax.inject 指定了獲取物件的一種方法,該方法與構造器、工廠這些傳統方法相比可以獲得更好的可重用性、可測試性以及可維護性。此方法的處理過程就是大家熟知的依賴注入。javax.inject.Provider其語法:public interface Provider,提供了一個T的例項,通常作為一個依賴注入容器的父介面,可以注入任何型別的T,當然也可以注入Provider,相對於直接注入,有幾個好處:檢索多個例項,延遲或者選擇性的檢索一個例項,打破迴圈依賴,抽象的scope,可以從一個包含scope的更小的scope中檢索一個例項。

  (2)繼承自AbstractAutowireCapableBeanFactory的方法

  提供bean的建立(有construct方法),屬性注值,繫結(包括自動繫結)和初始化。處理執行時bean引用,解析管理的集合,呼叫初始化方法。

  最主要的實現的模板方法是:AutowireCapleBeanFactory類(在包org.springframework.beans. factory.config中,AbstractAutowireCapableBeanFactory實現此介面)中的方法resolveDependency(DependencyDescriptor, String, Set, TypeConverter)。這個方法用來實現型別的自動繫結AbstractAutowireCapableBeanFactory.copyConfigurationFrom(ConfigurableBeanFactory otherFactory)

  (3)繼承自ListableBeanFactory介面的方法

  ListableBeanFactory(在包org.springframework.beans.factory中)是beanFactory介面的擴充套件介面,它可以列舉所有的bean例項,而不是客戶端通過名稱一個一個的查詢得出所有的例項。要預載入所有的bean定義的beanfactory可以實現這個介面來。該介面定義了訪問容器中Bean基本資訊的若干方法,如檢視Bean的個數、獲取某一型別Bean的配置名、檢視容器中是否包括某一Bean等方法;

繼承自該介面的方法有:containsBeanDefinition()、findAnnotationOnBean() 、getBeanDefinitionCount() 、getBeanDefinitionNames()、getBeanNamesForType() 、getBeansOfType() 、getBeansWithAnnotation() 。

  (4)繼承自ConfigurableListableBeanFactory介面的方法

  ConfigurableListableBeanFactory(在包org.springframework.beans.factory.config中)同時繼承了ListableBeanFactory,AutowireCapableBeanFactory和ConfigurableBeanFactory,提供了對bean定義的分析和修改的便利方法,同時也提供了對單例的預例項化。

  繼承該介面的方法有:freezeConfiguration() 、getBeanDefinition()、ignoreDependencyInterface() 、ignoreDependencyType() 、isAutowireCandidate() 、isConfigurationFrozen() 、preInstantiateSingletons()、registerResolvableDependency() 。

  (5)繼承自BeanDefinitionRegistry介面的方法

  BeanDefinitionRegistry:Spring配置檔案中每一個節點元素在Spring容器裡都通過一個BeanDefinition物件表示,它描述了Bean的配置資訊。而BeanDefinition Registry介面提供了向容器手工註冊BeanDefinition物件的方法。

  繼承該介面的方法有:containsBeanDefinition() 、getBeanDefinition()、getBeanDefinitionCount()、getBeanDefinitionNames() 、isBeanNameInUse() 、registerBeanDefinition() 、removeBeanDefinition() 。

  (6)序列化支援

  private void writeObject(java.io.ObjectOutputStream out);

  private void readObject(java.io.ObjectInputStream in);

  private void readObjectNoData()。

10.2  StaticListableBeanFactory:靜態BeanFactory的實現,用來程式設計實現註冊已經存在的單例例項。

10.3  AbstractBeanFactory:BeanFactory的抽象基類實現,提供ConfigurableBeanFactory SPI的全部功能。

  在此簡單介紹下SPI機制。SPI全稱Service Provider Interface,一種服務發現機制。是Java提供的一套用來被第三方實現或者擴充套件的介面,它可以用來啟用框架擴充套件和替換元件。SPI的作用就是為這些被擴充套件的API尋找服務實現。SPI 的本質是將介面實現類的全限定名配置在檔案中,並由服務載入器讀取配置檔案,載入實現類。可以在執行時,動態為介面替換實現類。可以很容易的通過 SPI 機制為程式提供拓展功能。

10.4  AbstractAutowireCapableBeanFactory:抽象beanFactory的超類,它使用指定的RootBeanDefinition類的所有方法實現建立預設bean。

 

10.5  AbstractBeanDefinition:具體、成熟BeanDefinition類的基類,構造出RootBeanDefinition和ChildBeanDefinition的通用屬性。

10.6  RootBeanDefinition:根BeanDefinition,表示在執行時期的spring BeanFactory中一個合併的BeanDefinition。

10.7  ChildBeanDefinition:從父類繼承各種設定的bean的beanDefinition。

10.8  GenericBeanDefinition:通用BeanDefinition是一站式的標準bean Definition。

10.9  BeanDefinitionReader:bean definition解析器的簡單介面。

10.10  BeanDefinitionReaderUtils:BeanDefinitionReader實現使用的工具方法類。

10.11  AbstractBeanDefinitionReader:實現了BeanDefinitionReader介面,是beanDefinitionReader的抽象基類。

10.12  PropertiesBeanDefinitionReader:簡單屬性格式的BeanDefinitionReader。

10.13  BeanDefinitionDefaults:簡單保持BeanDefinition的預設屬性類。

10.14  BeanDefinitionBuilder:使用建造者模式構建BeanDefinition的程式設計方法。

10.15  BeanDefinitionRegistry:持有beanDefinition的註冊介面,例如RootBeanDefinition和ChildBeanDefinition例項。

10.16  SimpleBeanDefinitionRegistry:BeanDefinitionRegistry介面的簡單實現。

10.17  BeanDefinitionRegistryPostProcessor:標準BeanFactoryPostProcessor SPI的擴充套件介面,允許在常規BeanFactoryPostProcessor檢查之前註冊更多bean definition。

10.18  BeanDefinitionResource:繼承自AbstractResource,描述BeanDefinition的資源。在此介紹一下Spring使用的一種設計模式:裝飾器模式。裝飾器模式允許向一個現有的物件新增新的功能,同時又不改變其結構。裝飾者可以在所委託被裝飾者的行為之前或之後加上自己的行為,以達到特定的目的(如:功能的增強)。

10.19  BeanDefinitionValueResolver:主要用在bean工廠實施中,解析bean definition物件中的value,根據目標bean例項轉換成真正的值。

10.20  BeanDefinitionValidationException:驗證一個bean definition時出錯丟擲的異常。

10.21  BeanDefinitionOverrideException:BeanDefinitionStoreException一個子類,顯示一個在嘗試一個非法的過載。比如為同一個bean name註冊一個新的definition,但是DefaultListableBeanFactory的isAllowBeanDefinitionOverriding卻為false的時候。

                 

10.22  ManagedArray:集合類,用來儲存它所管理的array元素,它可以包含執行時期的bean引用(將被解析為bean物件)。

10.23  ManagedList:集合類,用來儲存它所管理的List元素,它可以包含執行時期的bean引用(將被解析為bean物件)。

10.24  ManagedMap:集合類,用來儲存它所管理的array值,它可以包含執行時期的bean引用(將被解析為bean物件) 。

10.25  ManagedSet:集合類,用來儲存它所管理的set值,它可以包含執行時期的bean引用(將被解析為bean物件) 。

10.26  ManagedProperties:表示一個spring管理的屬性例項,它支援父/子 definition的合併。

       

10.27  AutowireCandidateQualifier:解析自動繫結備選項Qualifier。

10.28  AutowireCandidateResolver:策略介面,對特定的依賴,這個介面決定一個特定的bean definition是否滿足作為自動繫結的備選項。

10.29  SimpleAutowireCandidateResolver:繼承自AutowireCandidateResolver,當出現不支援的註解時使用。

10.30  GenericTypeAwareAutowireCandidateResolver:繼承自SimpleAutowireCandidateResolver,一個通用的AutowireCandidateResolver。

10.31  AutowireUtils:工具類,為具有自動裝載能力的bean工廠提供一些有用的方法。

 

10.32  LookupOverride:表示可以重寫一個在同一個IOC上下文中查詢物件的方法。

10.33  MethodOverride:表示重寫物件,它針對IOC容器所管理物件的方法的重寫。

10.34  MethodOverrides:一組方法重寫,決定了在執行時期對spring IOC容器管理物件的重寫方法(如果存在的話)。

10.35  ReplaceOverride:MethodOverride的擴充套件,表示一個IOC容器方法的任意重寫。

 

10.36  InstantiationStrategy:負責根據相應的根bean definition建立例項的介面。

10.37  SimpleInstantiationStrategy:BeanFactory中簡單物件的初始化策略。

10.38  CglibSubclassingInstantiationStrategy:BeanFactory預設物件初始化策略。

 

10.39  BeanNameGenerator:對beanDefinition產生bean名稱的策略介面。

10.40  DefaultBeanNameGenerator:BeanNameGenerator介面的預設實現,代理BeanDefinitionReaderUtils.generateBeanName(BeanDefinition, BeanDefinitionRegistry)方法。

10.41  SecurityContextProvider:執行在beanFactory中的安全Context的提供者。

10.42  SimpleSecurityContextProvider:SecurityContextProvider的簡單擴充套件。

10.43  DefaultSingletonBeanRegistry:共享bean例項的通用註冊,實現了SingletonBeanRegistry。

10.44  FactoryBeanRegistrySupport:一個支援單例註冊(需要處理FactoryBean例項)的基類,集合了DefaultSingletonBeanRegistry對單例的管理功能。

10.45  ConstructorResolver:解析建構函式和工程方法的代理。對建構函式的解析主要通過引數匹配來實現。

10.46  DisposableBeanAdapter:對一個給定的bean例項進行銷燬bean及進行銷燬的相關工作的介面卡。

  這裡簡單介紹介面卡模式:介面卡就是為了實現介面而做的,如果不用介面卡,你去實現介面的話,需要實現介面中的所有方法,這要那個就會帶來一些麻煩,但是如果你使用了介面卡,就可以定義一個類去實現介面,然後當你用哪個方法的時候直接繼承該類就行了,這個類就是介面卡了。介面卡模式的意義是要將一個介面轉變成另一個介面,它的目的是通過改變介面來達到重複使用的目的。而裝飾器模式不是要改變被裝飾物件的介面,而是恰恰要保持原有的介面,但是增強原有物件的功能,或者改變原有物件的處理方式而提升效能。

10.47  MethodReplacer:一個可以重新定義IOC容器物件的所有方法的介面:方法注入是依賴注入的一種形式。

10.48  MergedBeanDefinitionPostProcessor:後處理回撥介面,在執行時合併bean definition。

10.49  NullBean:一個空bean的內部表示,比如呼叫FactoryBean的getObect()或者其他的工廠方法返回的是null值。

10.50  ImplicitlyAppearedSingletonException:繼承自IllegalStateException,一個內部使用的異常類,在ConstructorResolver引發,傳遞給初始化DefaultSingletonBeanRegistry。

11、org.springframework.beans.factory.wiring包含的介面和類

11.1  BeanConfigurerSupport:配置bean的便利基類,它可以對物件進行依賴注入。典型應用就是作為切面的子類使用。

11.2  BeanWiringInfo:儲存特定類的bean的繫結元資料資訊。在對註解和切面進行連線時使用。

11.3  BeanWiringInfoResolver:策略介面,能夠根據給定的一個新初始化的bean物件解析bean的名稱資訊。在此簡單介紹下策略模式:用意是針對一組演算法,將每一個演算法封裝到具有共同介面的獨立類中,從而使得它們可以相互替換。策略模式使得演算法可以在不影響到客戶端的情況下發生變化。通俗的講就是遇到一種問題有多種解法的時候,我們可以根據環境或者條件的不同選擇不同的演算法或者策略來完成該功能。

11.4  ClassNameBeanWiringInfoResolver:BeanWiringInfoResolver的簡單預設實現,查詢一個和全限定名同名的bean的名稱。

12、org.springframework.beans.factory.xml包含的介面和類

12.1  AbstractBeanDefinitionParser:BeanDefinitionParser的抽象實現,提供了許多便利方法和模板方法,模板方法需要在子類進行重寫來提供具體的邏輯實現。

12.2  AbstractSimpleBeanDefinitionParser:AbstractBeanDefinitionParser的簡單實現,當將要解析元素的屬性名和配置類的屬性名一一對應的時候,可以用到該類。

12.3  AbstractSingleBeanDefinitionParser:BeanDefinitionParser的基類,需要解析和定義單獨的BeanDefinition。

12.4  BeanDefinitionDecorator:DefaultBeanDefinitionDocumentReader用來處理自定義的,內嵌的標籤的介