1. 程式人生 > 實用技巧 >JavaEE - 11集合Collection

JavaEE - 11集合Collection

動態橫切是通過切入點和連線點在一個方面中建立行為的過程,連線點可以在執行時橫向地應用於現有物件。動態橫切通常用於幫助向物件層次中的各種方法新增日誌記錄或身份認證。在很多應用場景中,動態橫切技術基本上代表了AOP。

動態橫切技術的核心主要包括join point(連線點),point cut(切入點),advice(通知)和aspect(方面)。在前面,我已經概要地介紹了這些術語分別代表的含義。接下來,我將以一個具體的例項來進一步闡述它們在AOP動態橫切中實現的意義。

考慮一個電子商務系統,需要對訂單進行新增、刪除等管理操作。毫無疑問,在實際的應用場景中,這些行為應與許可權管理結合,只有獲得授權的使用者方能夠實施這些行為。採用傳統的設計方法,其虛擬碼如下:
public class OrderManager
{
private ArrayList m_Orders;
public OrderManager()
{
m_Orders = new ArrayList();
}
public void AddOrder(Order order)
{
if (permissions.Verify(Permission.ADMIN))
{

m_Orders.Add(order);

}
}

public void RemoveOrder(Order order)
{
if (permissions.Verify(Permission.ADMIN))
{
m_Orders.Remove(order);
}
}
}

同樣的,在該電子商務系統中,還需要對商品進行管理,它採用了同樣的授權機制:
public class ProductManager
{
private ArrayList m_Products;
public ProductManager()
{
m_Products = new ArrayList();
}
public void AddProduct(Product product)
{
if (permissions.Verify(Permission.ADMIN))
{
m_Products.Add(product);
}
}
public void RemoveProduct(Product product)
{
if (permissions.Verify(Permission.ADMIN))
{
m_Products.Remove(product);
}
}
}

如此以來,在整個電子商務系統中,核心業務包括訂單管理和商品管理,它們都需要相同的許可權管理,如圖2.4所示:

aop2.4.gif
圖2.4 電子商務系統的許可權驗證實現

毫無疑問,利用AOP技術,我們可以分離出系統的核心關注點和橫切關注點,從橫向的角度,擷取業務管理行為的內部訊息,以達到織入許可權管理邏輯的目的。當執行AddOrder()等方法時,系統將驗證使用者的許可權,呼叫橫切關注點邏輯,因此該方法即為AOP的join point。對於電子商務系統而言,每個需要許可權驗證的方法都是一個單獨的join point。由於許可權驗證將在每個方法執行前執行,所以對於這一系列join point,只需要定義一個point cut。當系統執行到join point處時,將根據定義去查詢對應的point cut,然後執行這個橫切關注點需要實現的邏輯,即advice。而point cut和advice,就組合成了一個許可權管理aspect。

aop2.5.gif
圖2.5 AOP動態橫切的技術實現

由於aspect是一個封裝的物件,我們可以定義這樣一個aspect:
private static aspect AuthorizationAspect{……}

然後在這個aspect中定義point cut,在point cut中,定義了需要擷取上下文訊息的方法,例如:
private pointcut authorizationExecution():
execution(public void OrderManager.AddOrder(Order)) ||
execution(public void OrderManager.DeleteOrder(Order)) ||
execution(public void ProductManager.AddProduct(Product)) ||
execution(public void ProductManager.DeleteProduct(Product));

由於許可權驗證是在訂單管理方法執行之前完成,因此在before advice中,定義許可權檢查:
before(): authorizationExecution()
{
if !(permissions.Verify(Permission.ADMIN))
{
throw new UnauthorizedException();
}
}

通過定義了這樣一個完整的aspect,當系統呼叫OrderManager或ProductManager的相關方法時,就觸發了point cut,然後呼叫相應的advice邏輯。如此以來,OrderManager和ProductManager模組就與許可權管理模組完全解除了依賴關係,同時也消除了傳統設計中不可避免的許可權判斷的重複程式碼。這對於建立一個鬆散耦合、可擴充套件的系統軟體是非常有利的。