1. 程式人生 > >Spring原理簡單分析

Spring原理簡單分析

本文知識點主要來自Spring技術內幕:深入解析Spring架構與設計原理(第2版) 。

1.spring設計理念

作業系統關心的是對儲存、計算、通訊、外圍裝置等物理資源的管理,為使用者提供一個統一的服務介面。

spring其關心的是一些企業應用資源的使用,比如資料的持久化,資料整合、事務處理、訊息中介軟體、分散式計算等高效可靠處理企業資料方法的技術抽象。

spring劃分為三個層次核心、元件和應用3個基本的層次

核心及:IOC容器和aop模組。通過IOC容器來管理pojo物件,以及他們相互之間的耦合關係,使企業的資訊或資料 資源可以用簡單的java語言來抽象和描述;另一方面,可以通過

aop,以動態和非侵入式的方式來增強服務的功能。

面向介面開發而不是依賴於具體的產品實現。

架構:SpringIOCIOC容器BeanFactory的介面與實現,同時為了讓應用更方便地使用IOC容器,還需要在IOC容器的外圍提供其他的支援,這些支援包括Resource訪問資源的抽象和定位等。Spring還設計了IOC容器的高階形態ApplicationContext應用上下文供使用者使用(一般在測試中)。

              Spring AopTransactionProxyFactoryBean宣告式事務處理。在這個模組中,Spring  aop實現了一個完整的建立aop代理物件,實現

aop攔截器,直至實現各種Advice通知的過程。

              SpringMVC:這個模組以DispatcherServlet為核心,實現了MVC模式,包括怎樣與WEB容器環境的整合,web請求的攔截、分發、處理和ModelAndView資料的返回,以及如何整合各種UI檢視展現和資料表現。通過這個模組,可以完成WEB的前端設計。

              Spring JDBC/Spring  ORM:Spring JDBC包提供了jdbcTemplate作為模板類。封裝了基本的資料庫操作方法,如資料查詢、更新等。還提供了HibernateTemplate來實現對Hibernate

的驅動,比如:Session的獲取和關閉、事務處理的關聯等,從而把一些通用的特性實現抽象到Spring中來,更充分地體現了Spring的平臺作用。

              Spring事務處理:通過AOP的切面增強實現了宣告式事務處理的功能。只需要在IOC容器中對事務屬性進行配置就行。

2.Spring的核心IOC容器和aop的實現原理進行闡述。強調面向介面程式設計。

(本文圖片來自Spring技術內幕:深入解析Spring架構與設計原理(第2版) )

1.概念IOC

控制反轉,其實就是依賴注入。通過把物件的依賴注入交給框架後IOC容器來完成。

應用控制反轉後,當物件被建立時,由一個調控系統內的所有物件的外界實現將其所依賴的物件的引用傳遞給它,即依賴被注入到物件中。

2.應用場景

IOC容器系列的設計與實現:BeanFactory和ApplicationContext

BeanFactory介面設計了getBean方法,方法:

3.使用步驟:

1.建立IOC配置檔案的抽象資源,這個抽象資源包含了BeanDefinition的定義資訊。

2.建立一個BeanFactory。

3.建立一個載入BeanDefinition的讀取器。

4.從定義好的資源位置讀入配置資訊,具體的解析過程由XMLBeanDefinitionReader來完成。

4.ApplicationContext的應用場景

  支援不同的資訊源 。

  訪問資源,體現在Resource中

   支援應用事件,繼承了介面ApplicationEventPublisher

IOC容器的初始化過程

第一個過程是Resource定位過程,它由ResourceLoader通過統一的Resource介面來完成。

第二個過程是BeanDefinition的載入。這個載入過程是把使用者定義好的Bean表示成IOC容器內部的資料結構,而這個內部的資料結構就是BeanDefinition。這個BeanDefinition實際上就是pojo物件在IOC容器中的抽象,通過這個BeanDefinition定義的資料結構,使IOC容器能夠方便地對pojo物件也就是bean進行管理。

第三個過程是向IOC容器註冊這些BeanDefinition的過程。在IOC容器內部將BeanDefinition注入到一個HashMap中。注意這個過程,不包括bean依賴注入的實現。

在spring IOC的設計中,Bean定義的載入和依賴注入是兩個獨立的過程。依賴注入一般發生在應用第一次通過getBean向容器索取Bean的時候(所以在Action中一般要呼叫getBean這個方法,才能依賴注入),

5.BeanDefinition的Resource定位

classPathResource    res =  new   ClassPathResource("bean.xml");

getBean是依賴注入的起點,之後會呼叫createBean。

IOC實現的原理,一直是通過BeanDefinition的屬性值和建構函式以顯示的方式對Bean的依賴關係進行管理的。

5.1.介紹FactoryBean的實現

FactoryBean的生產特性是在getBean中起作用的

bean = getObjectForBeanInstance(sharedInstance , name , beanname , mbd);

5.2.autowiring(自動依賴裝配)的實現

autowirng屬性進行處理,從而完成對bean屬性的自動依賴裝配,實在populateBean中實現的。

通過呼叫autowireByNameautowireByType來完成自動依賴裝配。以autowireByName為例子。

他首先需要得到當前Bean的屬性名,這些屬性名已經在BeanWrapperBeanDefinition中封裝好了,然後是對這一系列屬性名進行匹配的過程。因為已經有了屬性的名字,所以可以直接使用屬性名作為Bean名字向容器索取Bean,這個getBean會觸發當前bean的依賴bean的依賴注入,從而得到屬性對應的依賴Bean。在執行完這個getBean後,把這個依賴Bean注入到當前Bean的屬性中去。這樣就可以了。

知識補充

註解知識補充:

@Autowired

屬於Spring註解,它可以對類成員變數、方法及建構函式進行標註,完成自動裝配的工作。通過@Autowired的使用來消除setget方法。

步驟:

1.applicationContext.xml中加入:

<!-- 該 BeanPostProcessor 將自動對標註 @Autowired 的 Bean 進行注入 -->     

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>  

2.修改在原來注入spirng容器中的bean的方法。    在域變數上加上標籤@Autowired,並且去掉 相應的getset方法

例如:

publicclassStudent {  //JavaBean

    @Autowired    

private HomeWorkhomeWork;     

    @Autowired    

private Classclass;    

    …     

}   

3.Resource的區別

這個註解屬於J2EE,預設按照名稱進行裝配,名稱可以通過name屬性進行指定。我一般使用這個註解。

@Resource(name="student")     

privateStudentstudent;    


3.AOP


1.AOP程式設計

從關注點中分離出橫切關注點是面向切面的程式設計的核心概念

基礎可以視為待增強物件或者目標物件

切面通常包含對於基礎的增強應用

配置可以看成是一種編織,通過在aop體系中提供這個配置環境,可以吧基礎和切面結合起來,從而完成切面對目標物件的編織實現。

2.Advice通知

Advice定義在連線點做什麼,為切面增強提供織入路口。

介面定義在org.aopalliance.aop.Advice中。

比如:BeforeAdviceAfterAdviceThrowsAdvice

BeforeAdvice原理:

1.瞭解類層次關係。

2.回撥函式before。具體參照原始碼,主要是使用了回撥函式。

3.Pointcut切點

切點決定Advice通知應該作用於那個連線點,也就是說通過Pointcut來定義需要增強的方法的集合,通常意味著標識方法。


4.Advisor通知器

完成對目標方法的切面增強設計(Advice)和關注點的設計(Pointcut)以後,需要一個物件把它們結合起來,完成這個作用的就是Advisor(通知器)。通過Advisor,可以定義應該使用哪個通知並在那個關注點使用它,也就是說通過Advisor,把AdvicePointcut結合起來,這個結合為使用IOC容器配置aop應用。

Spring aop中,以一個Advisor的實現(DefaultPointAdvisor)為例,來了解Advisor的工作原理。在DefaultPointcutAdvisor中有兩個屬性,分別是AdvicePointcut

舉例微博:http://blog.csdn.net/hongmeikaile/article/details/6523067點選開啟連結

3.Spring  aop的設計與實現。

動態代理