徒弟:這個spring怎麼管理bean的呢?是不是我要什麼就給我什麼呀?
師傅:師傅會詳細講講,當然,你如果沒有進行配置,交給它管理,怎麼可能要什麼給什麼呢?
1、Spring架構概述:
<a href="http://jooben.blog.51cto.com/attachment/201005/5/253727_1273018933j4yA.png"></a>
圖一
Core 封裝包是架構的最基礎部分,提供IoC和依賴注入特性。這裡的基礎概念是BeanFactory,它提供對Factory模式的經典實作來消除對程式性單例模式的需要,并真正地允許你從程式邏輯中分離出依賴關系和配置。
Context(上下文) 封裝包構築于Core封裝包的堅固基礎上:它提供了用一種架構風格的方式來通路對象,有些像JNDI系統資料庫。Context封裝包繼承了beans包的功能,還增加了國際化(I18N)(用于規範resource bundle),事件傳播,資源裝載,以及透明建立上下文,例如通過servlet容器。
DAO 提供了JDBC的抽象層,它可消除冗長的JDBC編碼和解析資料庫廠商特有的錯誤代碼。 并且,JDBC 封裝包還提供了一種比程式設計性更好的聲明性事務管理方法,不僅僅是實作了特定接口,而且對所有的POJOs(plain old Java objects)都适用。
ORM 封裝包提供了常用的“對象/關系”映射APIs的內建層。 其中包括JPA、JDO、Hibernate 和 iBatis 。利用ORM封裝包,可以混合使用所有Spring提供的特性進行“對象/關系”映射,如前邊提到的簡單聲明性事務管理。
Spring的 AOP 封裝包提供了符合 AOP Alliance規範的面向方面的程式設計(aspect-oriented programming)實作,讓你可以定義,例如方法攔截器(method-interceptors)和切點(pointcuts),從邏輯上講,進而減弱代碼的功能耦合,清晰的被分離開。而且,利用source-level的中繼資料功能,還可以将各種行為資訊合并到你的代碼中,這有點象.Net的attribute的概念。
Spring中的 Web 包提供了基礎的針對Web開發的內建特性,例如多方檔案上傳,利用Servlet listeners進行IoC容器初始化和針對Web的application context。當與WebWork或Struts一起使用Spring時,這個包使Spring可與其他架構結合。
Spring中的 MVC 封裝包提供了Web應用的Model-View-Controller(MVC)實作。Spring的MVC架構并不是僅僅提供一種傳統的實作,它提供了一種 清晰的 分離模型,在領域模型代碼和web form之間。并且,還可以借助Spring架構的其他特性。
既然Core 封裝包是架構的最基礎部分,也就是必須首先掌握,正如建造大樓,你得先打地基,地基不牢固,容易造成豆腐渣工程,學習也是一樣的道理。
2、IoC容器
什麼叫IoC?貌似看起來很新鮮的概念,我們翻譯一下:Inversion of Control(控制反轉)
生成對象,一般原則,我們都會去new,例如:
BookService bookService = new BookServiceImpl();
如果,我們的項目中有成千上萬的類,怎麼處理了,假設專門委派A來負責對象的初始化工作(或許我們需要付給他工資),相當于業務開發人員并不關注對象的初始化工作,需要使用對象,則從A處擷取,這種方式,我們稱作:控制反轉。也就是說,在傳統的應用程式中,控制權在應用程式本身,程式的控制流程完全由開發者控制;在IoC模式下,控制權發生了反轉,從應用程式轉移到了IoC容器(相當于前面送出的交由A負責對象的建立)。這時,元件不再由應用程式負責建立和配置,而是交由IoC容器負責,同時為了能夠在應用程式中使用元件,需要應用“注入”機制,Spring的核心機制-依賴注入,可見,依賴注入(Dependency Injection)和控制反轉(Inversion of Control)是同一個概念。
Ok,A解放出來了,Spring容器接替了A的角色,A可以繼續加入應用開發中。
提示:
具體可以參考:Spring Framework開發手冊:第 3 章 IoC(控制反轉)容器
上一章已經提到:
推薦使用@Resource注解 是jdk提供的。
1、屬性注入
2、屬性的setter方法注入。
這個時候,我給A一個任務,在BoodService的實作類中注入BookDao對象,應該如何實作呢?
A立刻寫出以下代碼,如圖所示:
<a href="http://jooben.blog.51cto.com/attachment/201005/5/253727_1273018935xLdM.png"></a>
圖二
主要是将Servie擷取具體資料的方法,轉移到BookDAOImpl,進行具體實作。
public class BookServiceImpl implements BookService {
private BookDAO bookDAO;
@Override
public void listBook() {
bookDAO.listBook();
}
}
beans.xml中也配置了:
<bean id="bookDAO" class="com.netease.lee.dao.impl.BookDAOImpl"/>
到底要如何實作呢?其實,很簡單,
修改BookServiceImpl為:
@Resource
會出現提示,如圖所示,需要引入:javax.annotation的包(jre6中已經包含了)
<a href="http://jooben.blog.51cto.com/attachment/201005/5/253727_1273018935U6Xp.png"></a>
圖三
引入之後,A運作Junit Test測試,發現失敗提示如下:
<a href="http://jooben.blog.51cto.com/attachment/201005/5/253727_1273018935JAAc.png"></a>
圖四
why?難道A忘記一些步驟了?
原來忘記了一個重要的注解開關,在beans裡面添加:<context:annotation-config/>
再次運作測試用例:
<a href="http://jooben.blog.51cto.com/attachment/201005/5/253727_1273018936dxVl.png"></a>
圖五
A很高興,終于完成了任務,倒吸一頭冷汗。經過這次磨練,A終于牢牢記住關鍵步驟了。
更加詳細的依賴注入,參考Spring Framework開發手冊:第 3 章 IoC(控制反轉)容器3.3. 依賴
本文轉自jooben 51CTO部落格,原文連結:http://blog.51cto.com/jooben/309877