標籤:

為什麼要用spring的IOC和AOP?用了IOC和AOP的優點缺點是什麼


IOC(Inverse of Control)控制反轉是Spring容器的內核,AOP,聲明式事務等功能都是在此基礎上開花結果的。所謂IOC,就是通過容器來控制業務對象之間的依賴關係,而非傳統實現中,由代碼直接控制。這也就是「控制反轉」概念所在;控制權由應用代碼轉到了外部容器,控制權的轉移,就是反轉。控制權轉移帶來的好處就是降低了業務對象之間的依賴程度。

編程語言最終極的目標就是能以更自然、更靈活的方式模擬世界,從原始機器語言到過程語言再到面向對象的語言,編程語言一步步地用更自然、更靈活的方式描述軟體。AOP是軟體開發思想發展到一定階段的產物。但AOP的出現並不是要完全替代OOP,而僅僅作為OOP的有益補充。雖然AOP作為一項編程技術已經有很多年的歷史,但一直長期停留在學術領域,直到Spring的出現,AOP才作為一項真正的實用技術在應用領域開疆擴土。

關於為什麼要使用AOP,下面這個例子可以很好的解釋。

首先,按照軟體重構思想的理念,如果多個類中出現相同的代碼,應該考慮定義一個共同的抽象類,將這些相同的代碼提取到抽象類當中去。比如Horse、Pig、Camel這些對象都有run()、eat()方法,通過引入一個包含這兩個方法抽象的Animal父類,Horse、Pig、Camel就可以通過集成Animal復用到run()和eat()方法。通過引入父類消除多個類中的重複代碼的方式在大多數情況下是可行的,但世界並非永遠這麼簡單,比如下面所示的景區管理業務類。

import com.smart.dao.ViewPointDao;
import com.smart.dao.ViewSpaceDao;
import com.smart.domain.ViewSpace;

/**
* 景區管理的服務類
*/
public class ViewSpaceService {

private TransactionManager transManager;
private PerformanceMonitor pmonitor;
private ViewSpaceDao viewSpaceDao;
private ViewPointDao viewPointDao;

/**
* 新增一個旅遊景區
*
* @param viewSpace
*/
public void addViewSpace(ViewSpace viewSpace) {
pmonitor.start();
transManager.beginTransaction();
viewSpaceDao.addViewSpace(viewSpace);
transManager.endTransaction();
pmonitor.end();
}

/**
* 刪除某個景點
*
* @param pointId
*/
public void deleteViewPoint(int pointId) {
pmonitor.start();
transManager.beginTransaction();
viewPointDao.deleteViewPoint(pointId);
transManager.endTransaction();
pmonitor.end();
}

}

其中pmonitor是方法性能監視代碼,它在方法調用前啟動,在方法調用返回前結束,並在內部記錄性能監視的結果信息。

其中transManager的代碼是事務開始和事務提交的代碼,我們發現我們的業務代碼淹沒在重複化非業務性的代碼之中,性能監視和事務管理這些非業務性代碼葛藤纏樹搬包圍著業務性代碼。

此時我們就不能通過抽象父類的方式消除以上的重複性代碼,因為這些邏輯依附在業務類方法的流程中,它們不能夠轉移到其他地方去。於是產生了AOP這種思想。


IOC是解耦,提供一種構造對象的方式,使得一種功能能有多種實現,且不構成依賴。spring 的IOC的缺點:佔用內存多、構造對象慢、啟動慢。

springAOP是提供一種基於spring框架的切面編程企業級解決方案,雖然這個已經很強大,但是依然還是沒有aspectj強大,比如:目前還不支持流程切面。織入慢執行效率低、不支持new關鍵字創建的對象的切入,必須使用bean factory織入。


優點:IOC是解耦, AOP主要是提供另外一種編程思路,可以把類似的行為抽離出來統一處理。

缺點:IOC引入了spring, 就是引入了spring的執行時容器, 讓容器負責你的對象的周期。這樣就在執行期依賴了spring。AOP的缺點,如果要說,就是改變了項目的編程思路。


可以看看spring in action的第一章,看完之後就有個大概的認識了。特別是騎士和吟唱詩人的例子


程序 就是為了解決某特定現實問題而出現的計算機科學產物!

程序既思想 快速 有效解決問題的一種思維方式!

ioc aop 是通過本身的這種思維方式打到快速 有效的目的


推薦閱讀:

TAG:Java | Spring | IOC | AOP |