天天看點

【spring架構】AOP介紹

什麼是aop

1.面向切面程式設計(aspect-oriented-programming)

a)是面向對象的思維方式的有力補充。

下面利用之前寫過的模拟spring的工程給大家示範什麼是aop。

假設我們現在需要在userdaoimpl類的save方法中add資料代碼前後加日志資訊:

即是加業務邏輯。

方法1:直接加代碼:

方法2:(繼承模式)

寫一個userdaoimpl2繼承userdaoimpl

在beans.xml初始化userdaoimpl2

方法3:(組合模式)

寫一個userdaoimpl2實作userdao接口

好處:可以互相之間來回的組合(可以換成new userdaoimpl2();)

對于上面的方法3,如果邏輯bean非常多,那麼需要引入非常多的bean,這時候每一個bean都要加上日志代碼,工作量非常大。

解決辦法:

寫了一個logintercept的類,定義所有的日志代碼:

在業務邏輯的實作裡這樣使用:

但是這樣做還是有問題:

使用組合模式的時候,雖然這個logintercept可以加到任何bean上面,還是沒有解決一個問題,就是我要加到某個bean上面去的時候,必須得做一個新的類(如userimpl5),把原來的那個bean組合進來。

解決方法:你要讓我加到哪個bean上面,你幹脆給我寫個配置檔案,我就動态的把邏輯加到那個bean上面。這就是aop。

你在xml初始化bean的時候,加一個标簽,告訴程式我要加一個邏輯。例如:

這裡就可以将日志邏輯注入了。

但是你寫<log method="beforemethod"/>等标簽程式會幫你産生一個組合的類嗎?很顯然不能,是以這個時候你想要動态的産生我們想要的那個類,就要使用"動态代理"了。

jdk中可以實作動态代理:

利用proxy和invocationhandler

具體細節詳見動态代理的文章:http://blog.csdn.net/acmman/article/details/44276397

下一篇總結我會利用動态代理實作aop,并解釋aop:http://blog.csdn.net/acmman/article/details/44276427

轉載請注明出處:http://blog.csdn.net/acmman/article/details/44276369