AOP編程入門--Java篇
來源:互聯網
上載者:User
Aspect Oriented Programming(AOP),面向切面編程,是一個比較熱門的話題。AOP主要實現的目的是針對業務處理過程中的切面進行提取,它所面對的是處理過程中的某個步驟或階段,以獲得邏輯過程中各部分之間低耦合性的隔離效果。比如我們最常見的就是日誌記錄了,舉個例子,我們現在提供一個服務查詢學生資訊的,但是我們希望記錄有誰進行了這個查詢。如果按照傳統的OOP的實現的話,那我們實現了一個查詢學生資訊的服務介面(StudentInfoService)和其實作類別(StudentInfoServiceImpl.java),同時為了要進行記錄的話,那我們在實作類別(StudentInfoServiceImpl.java)中要添加其實現記錄的過程。這樣的話,假如我們要實現的服務有多個呢?那就要在每個實現的類都添加這些記錄過程。這樣做的話就會有點繁瑣,而且每個實作類別都與記錄服務日誌的行為緊耦合,違反了物件導向的規則。那麼怎樣才能把記錄服務的行為與業務處理過程中分離出來呢?看起來好像就是查詢學生的服務自己在進行,但是背後日誌記錄對這些行為進行記錄,但是查詢學生的服務不知道存在這些記錄過程,這就是我們要討論AOP的目的所在。AOP的編程,好像就是把我們在某個方面的功能提出來與一批對象進行隔離,這樣與一批對象之間降低了耦合性,可以就某個功能進行編程。
我們直接從代碼入手吧,要實現以上的目標,我們可以使用一個動態代理類(Proxy),通過攔截一個對象的行為並添加我們需要的功能來完成。Java中的java.lang.reflect.Proxy類和java.lang.reflect.InvocationHandler介面為我們實現動態代理類提供了一個方案,但是該方案針對的對象要實現某些介面;如果針對的目的是類的話,cglib為我們提供了另外一個實現方案。等下會說明兩者的區別。
一、介面的實現方案:
1)首先編寫我們的業務介面(StudentInfoService.java):
public interface StudentInfoService{
void findInfo(String studentName);
}
及其實作類別(StudentInfoServiceImpl.java):
public class StudentInfoServiceImpl implements StudentInfoService{
public void findInfo(String name){
System.out.println("你目前輸入的名字是:"+name);
}
}
2)現在我們需要一個日誌功能,在findInfo行為之前執行並記錄其行為,那麼我們就首先要攔截該行為。在實際執行的過程中用一個代理類來替我們完成。Java中為我們提供了實現動態代理類的方案: