本文知識點主要來自Spring技術內幕:深入解析Spring架構與設計原理(第2版) 。
1.spring設計理念
操作系統關心的是對存儲、計算、通信、外圍設備等物理資源的管理,爲用戶提供一個統一的服務接口。
而spring其關心的是一些企業應用資源的使用,比如數據的持久化,數據集成、事務處理、消息中間件、分佈式計算等高效可靠處理企業數據方法的技術抽象。
把spring劃分爲三個層次核心、組件和應用3個基本的層次
核心及:IOC容器和aop模塊。通過IOC容器來管理pojo對象,以及他們相互之間的耦合關係,使企業的信息或數據 資源可以用簡單的java語言來抽象和描述;另一方面,可以通過aop,以動態和非侵入式的方式來增強服務的功能。
面向接口開發而不是依賴於具體的產品實現。
架構:SpringIOC:IOC容器BeanFactory的接口與實現,同時爲了讓應用更方便地使用IOC容器,還需要在IOC容器的外圍提供其他的支持,這些支持包括Resource訪問資源的抽象和定位等。Spring還設計了IOC容器的高級形態ApplicationContext應用上下文供用戶使用(一般在測試中)。
Spring Aop:TransactionProxyFactoryBean聲明式事務處理。在這個模塊中,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中實現的。
通過調用autowireByName和autowireByType來完成自動依賴裝配。以autowireByName爲例子。
他首先需要得到當前Bean的屬性名,這些屬性名已經在BeanWrapper和BeanDefinition中封裝好了,然後是對這一系列屬性名進行匹配的過程。因爲已經有了屬性的名字,所以可以直接使用屬性名作爲Bean名字向容器索取Bean,這個getBean會觸發當前bean的依賴bean的依賴注入,從而得到屬性對應的依賴Bean。在執行完這個getBean後,把這個依賴Bean注入到當前Bean的屬性中去。這樣就可以了。
知識補充
註解知識補充:
@Autowired
屬於Spring註解,它可以對類成員變量、方法及構造函數進行標註,完成自動裝配的工作。通過@Autowired的使用來消除set、get方法。
步驟:
1.applicationContext.xml中加入:
<!-- 該 BeanPostProcessor 將自動對標註 @Autowired 的 Bean 進行注入 -->
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
2.修改在原來注入spirng容器中的bean的方法。
在域變量上加上標籤@Autowired,並且去掉 相應的get和set方法
例如:
public class Student { //JavaBean 等
@Autowired
private HomeWorkhomeWork;
@Autowired
private Classclass;
…
}
3.Resource的區別
這個註解屬於J2EE,默認按照名稱進行裝配,名稱可以通過name屬性進行指定。我一般使用這個註解。
@Resource(name="student")
private Student student;
3.AOP
1.AOP編程
從關注點中分離出橫切關注點是面向切面的程序設計的核心概念
基礎可以視爲待增強對象或者目標對象
切面通常包含對於基礎的增強應用
配置可以看成是一種編織,通過在aop體系中提供這個配置環境,可以吧基礎和切面結合起來,從而完成切面對目標對象的編織實現。
2.Advice通知
Advice定義在連接點做什麼,爲切面增強提供織入路口。
接口定義在org.aopalliance.aop.Advice中。
比如:BeforeAdvice、AfterAdvice、ThrowsAdvice等
BeforeAdvice原理:
1.瞭解類層次關係。
2.回調函數before。具體參照源碼,主要是使用了回調函數。
3.Pointcut切點
切點決定Advice通知應該作用於那個連接點,也就是說通過Pointcut來定義需要增強的方法的集合,通常意味着標識方法。
4.Advisor通知器
完成對目標方法的切面增強設計(Advice)和關注點的設計(Pointcut)以後,需要一個對象把它們結合起來,完成這個作用的就是Advisor(通知器)。通過Advisor,可以定義應該使用哪個通知並在那個關注點使用它,也就是說通過Advisor,把Advice和Pointcut結合起來,這個結合爲使用IOC容器配置aop應用。
在Spring aop中,以一個Advisor的實現(DefaultPointAdvisor)爲例,來了解Advisor的工作原理。在DefaultPointcutAdvisor中有兩個屬性,分別是Advice和Pointcut。
舉例微博:http://blog.csdn.net/hongmeikaile/article/details/6523067點擊打開鏈接。
3.Spring aop的設計與實現。
動態代理