1、BeanDefinitionweb
BeanDefinition是配置文件<bean>元素標籤在容器中內部表示形式。建立最終的BeanDefinition主要包括兩個步驟:
1)利用BeanDefinitionReader對配置信息Resource進行讀取,經過XML解析器解析配置信息的DOM對象,簡單地爲每一個<bean>生成對應的BeanDefinition對象。可是這裏生成的BeanDefinition多是半成品,由於在配置文件中,咱們可能經過佔位符變量引用外部屬性文件的屬性,這些佔位符變量在這一步尚未被解析出來。
2)利用容器中註冊的BeanFactoryPostProcessor對半成品的BeanDefinition進行加工處理,將以佔位符表示的配置解析爲最終的實際值,這樣半成品的BeanDefinition就爲成品的。spring
2、FactoryBean和BeanFactory編程
一個是Factory,也就是IoC容器或對象工廠;一個是Bean。在Spring中,全部Bean都是由BeanFactory(也就是IoC容器)來進行管理的。但對FactoryBean而言,這個Bean不是簡單的Bean,而是一個能產生或者修飾對象生成的工廠Bean,它的實現與設計模式中的工廠模式和修飾器模式相似。BeanFactory接口設計了getBean方法,這個方法是使用IoC容器API的主要方法,Bean的取得是經過指定名字來進行索引的。設計模式
BeanFactory繼承體系:http://mydream1987.iteye.com/blog/1151380緩存
AutowireCapableBeanFactory→AbstractAutowireCapableBeanFactory→DefaultListableBeanFactory→XmlBeanFactory IoC容器的實現系列。XmlBeanFactory這個IoC容器能夠讀取以XML形式定義的BeanDefinition。安全
@Deprecated public class XmlBeanFactory extends DefaultListableBeanFactory { private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this); /** * Create a new XmlBeanFactory with the given resource, * which must be parsable using DOM. * @param resource XML resource to load bean definitions from * @throws BeansException in case of loading or parsing errors */ public XmlBeanFactory(Resource resource) throws BeansException { this(resource, null); } /** * Create a new XmlBeanFactory with the given input stream, * which must be parsable using DOM. * @param resource XML resource to load bean definitions from * @param parentBeanFactory parent bean factory * @throws BeansException in case of loading or parsing errors */ public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException { super(parentBeanFactory); this.reader.loadBeanDefinitions(resource); } }
編程式使用IOC容器:服務器
ClassPathResource res = new ClassPathResource("beans.xml"); DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory); reader.loadBeanDefinitions(res);
3、IOC容器初始化session
IoC容器的初始化包括BeanDefinition的Resouce定位、載入和註冊這三個基本的過程。Spring容器的初始化主要分爲三個步驟,分別使Bean信息的定位,解析與註冊。以XML文件形式的Bean信息爲例,Spring首先找到XML文 件的位置,而後讀取此文件,而且將文件解析成相應的BeanDefinition,最後將獲取到的BeanDefinition註冊到BeanFactory中去。 併發
從這副順序圖中咱們能夠看出,Spring容器的初始化過程主要由四個類來完成,咱們能夠參考下類的註釋以瞭解這幾個類的職責:框架
4、Spring IOC實現
咱們須要從整體概念上對spring IOC有一個全局認識:
5、總述
IOC-Inversion of Control,中文意爲控制反轉,將bean以內相互耦合的依賴關係交給框架來處理,bean的內部不須要再維護其所依賴bean的生命週期而更加關注自身的業務邏輯。spring IOC做爲IOC的一種實現,不只管理了各個bean的生命週期和依賴關係,還提供了豐富的擴展接口去動態的修改bean的行爲。
bean的生命週期:從bean的建立、初始化、使用再到最終被銷燬,整個過程當中bean對象由框架來統一管理(除了prototype的bean在建立初始化後脫離了容器管理,由應用使用方本身來負責bean的銷燬回收)。
bean的做用域:按照bean的做用範圍,bean的做用域分爲如下5種:singleton、prototype、request、session、global session。
singleton爲單例bean的做用域,在容器中被建立後僅維持一份bean對象,建立後被緩存,任何請求該bean對象都是在這一個bean上進行操做,因此要注意線程安全問題,防止併發帶來的數據修改不一致問題。好比DAO層的某個bean會被多個service使用,這些bean能夠由同一個對象來代替,由於bean的數據源和行爲都是一致的。
prototype爲原型bean的做用域,在任何被注入和容器中執行beanFactory.getBean()的時候,容器都會爲此類bean建立一個全新的對象供其餘對象使用。因爲不一樣對象中的bean是徹底不一樣的實例,因此它們之間互不影響,可是這樣一來系統開銷會比較大。
在spring 2.0以前僅有單例和非單例兩種類型的bean做用域,到了2.0以後引入了request、http session和global session這三種做用域。
request是針對web應用的http請求級別的bean做用域。HttpRequest就是一個很好的例子,request請求中包含用戶每次請求中的數據,每一次請求中傳輸的數據是不一樣的。
http session是指bean生命週期貫穿一次完整的http會話過程。只要客戶端和web服務器之間的會話沒有斷開,session級別的bean對象就不會被銷燬。具體例子如HttpSession對象,不一樣的session容器會爲其建立不一樣的session對象。
6、