Spring定義
Spring 是一個輕量級的控制反轉(zhuǎn) (IOC) 和面向切面 (AOP) 的容器框架
為什么使用Spring
1.降低了組件之間的耦合性 ,實現(xiàn)了軟件各層之間的解耦?
2.可以使用容器提供的眾多服務(wù),如事務(wù)管理,消息服務(wù)等?
3.容器提供單例模式支持?
4.容器提供了AOP技術(shù),利用它很容易實現(xiàn)如權(quán)限攔截,運行期監(jiān)控,系統(tǒng)日志等功能?
5.容器提供了眾多的輔助類,能加快應(yīng)用的開發(fā)?
6.spring對于主流的應(yīng)用框架提供了集成支持,如hibernate,mybatis,Struts2等?
7.spring屬于低侵入式設(shè)計,代碼的污染極低?
8.獨立于各種應(yīng)用服務(wù)器?
9.spring的DI機制(依賴注入)降低了業(yè)務(wù)對象替換的復(fù)雜性?
10.Spring的高度開放性,并不強制應(yīng)用完全依賴于Spring,開發(fā)者可以自由選擇spring
的部分或全部。
控制反轉(zhuǎn)(IOC)
IOC是什么
? ? ? ?類與類依賴關(guān)系交給容器處理。IoC不是一種技術(shù),只是一種思想,一個重要的面向?qū)ο缶幊痰姆▌t,它能指導(dǎo)我們?nèi)绾卧O(shè)計出松耦合、更優(yōu)良的程序。
優(yōu)點 :
- ?減少了對象的創(chuàng)建和管理 ,使代碼層次更加清晰。
- Spring 的IOC容器是一個輕量級的容器 ,沒有侵入性(不依賴容器的API) ,不需要實現(xiàn)一些特殊接口。
- 鼓勵我們面向接口編程。
- 減少了代碼的耦合,將耦合的部分推到了配置文件中 ,如果他們的關(guān)系發(fā)生了改變,只需要修改配置文件。
IOC有兩種方式:DI(依賴注入)和DL (依賴查找)
DL (依賴查找)
程序提供查找方式,交給容器去查找(回調(diào)函數(shù))
容器提供回調(diào)接口和上下文環(huán)境給組件。EJB和Apache Avalon都使用這種方式
下面代碼展示了基于JNDI實現(xiàn)的依賴查找機制。
public class MyBusniessObject{
private DataSource ds;
private MyCollaborator myCollaborator;
public MyBusnissObject(){
Context ctx = null;
try{
ctx = new InitialContext();
ds = (DataSource) ctx.lookup(“java:comp/env/dataSourceName”);
myCollaborator =
(MyCollaborator) ctx.lookup(“java:comp/env/myCollaboratorName”);
}……
DI(依賴注入)
一個對象需要另外一個對象時,無需在代碼中創(chuàng)建被調(diào)用者,而是依賴于外部容器,由外部容器創(chuàng)建后傳遞給程序
用圖例說明一下,傳統(tǒng)程序設(shè)計如下圖1,都是主動去創(chuàng)建相關(guān)對象然后再組合起來:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
當有了IoC/DI的容器后,在客戶端類中不再主動去創(chuàng)建這些對象了,如圖2所示
分享一位大神(沒找到源鏈接)對IoC與DI淺顯易懂的講解
1、IoC(控制反轉(zhuǎn))
首先想說說IoC(Inversion of Control,控制反轉(zhuǎn))。這是spring的核心,貫穿始終。所謂IoC,對于spring框架來說,就是由spring來負責(zé)控制對象的生命周期和對象間的關(guān)系。這是什么意思呢,舉個簡單的例子,我們是如何找女朋友的?常見的情況是,我們到處去看看找到自己喜歡的,然后打聽她們的興趣愛好、qq號、電話號………,想辦法認識她們,投其所好送其所要……這個過程是復(fù)雜深奧的,我們必須自己設(shè)計和面對每個環(huán)節(jié)。傳統(tǒng)的程序開發(fā)也是如此,在一個對象中,如果要使用另外的對象,就必須得到它(自己new一個),使用完之后還要將對象銷毀,對象始終會和其他的接口或類耦合起來。
那么IoC是如何做的呢?有點像通過婚介找女朋友,在我和女朋友之間引入了一個第三者:婚姻介紹所?;榻楣芾砹撕芏嗄心信馁Y料,我可以向婚介提出一個要求的列表,告訴它我想找個什么樣的女朋友,然后婚介就會按照我們的要求,提供一個女孩,我們只需要去和她談戀愛、結(jié)婚就行了。簡單明了,如果婚介給我們的人選不符合要求,我們就會拋出異常。整個過程不再由我自己控制,而是有婚介這樣一個類似容器的機構(gòu)來控制。Spring所倡導(dǎo)的開發(fā)方式就是如此,所有的類都會在spring容器中登記,告訴spring你是個什么東西,你需要什么東西,然后spring會在系統(tǒng)運行到適當?shù)臅r候,把你要的東西主動給你,同時也把你交給其他需要你的東西。所有的類的創(chuàng)建、銷毀都由 spring來控制,也就是說控制對象生存周期的不再是引用它的對象,而是spring。對于某個具體的對象而言,以前是它控制其他對象,現(xiàn)在是所有對象都被spring控制,所以這叫控制反轉(zhuǎn)。
2、DI(依賴注入)
IoC的一個重點是在系統(tǒng)運行中,動態(tài)的向某個對象提供它所需要的其他對象。這一點是通過DI(Dependency Injection,依賴注入)來實現(xiàn)的。比如對象A需要操作數(shù)據(jù)庫,以前我們總是要在A中自己編寫代碼來獲得一個Connection對象,有了 spring我們就只需要告訴spring,A中需要一個Connection,至于這個Connection怎么構(gòu)造,何時構(gòu)造,A不需要知道。在系統(tǒng)運行時,spring會在適當?shù)臅r候制造一個Connection,然后像打針一樣,注射到A當中,這樣就完成了對各個對象之間關(guān)系的控制。A需要依賴 Connection才能正常運行,而這個Connection是由spring注入到A中的,依賴注入的名字就這么來的。那么DI是如何實現(xiàn)的呢? Java 1.3之后一個重要特征是反射(reflection),它允許程序在運行的時候動態(tài)的生成對象、執(zhí)行對象的方法、改變對象的屬性,spring就是通過反射來實現(xiàn)注入的。
面向切面AOP
AOP是什么:
Aspect-oriented programming 面向切面(方面)的編程
AOP有什么用:
可以把業(yè)務(wù)邏輯和系統(tǒng)級的服務(wù)進行隔離
系統(tǒng)級的服務(wù)像系統(tǒng)的日志,事務(wù),權(quán)限驗證等
AOP怎么用:
動態(tài)代理
AOP優(yōu)點:
使業(yè)務(wù)邏輯跟各個系統(tǒng)級服務(wù)的耦合度降低,提高程序的重用性和開發(fā)效率
今天的spring介紹就寫到這里,后面會補充IOC和AOP的詳細分析,再見
?
本文摘自 :https://blog.51cto.com/u