Java程序员从笨鸟到菜鸟之(七十三)细谈Spring(五)spring之AOP底层大揭秘
眾所周知,Java是面向對象語言的有力代表,提到java我們就會立即想到面向對象,提到面向對象我們就會想到java。然而面向對象也并非完美無缺的,它更注重于對象層次結構方面的東西,對于如何更好的管理對象行為內部結構,還存在著些許不足。那么我們如何使這個問題的得到更完美的解決呢?答案就是AOP。
????????AOP:Aspect-Oriented?Programming。AOP是OOP的補充,是GOF的延續。我們知道設計模式是對于面向對象設計中經驗的總結,它孜孜不斷追求的就是調用者與被調用者之間的解耦。有了設計模式我們可以更有效的利用面向對象的特性,使得整個軟件設計更加靈活、優雅。但是設計模式是基于面向對象的思想而形成的,更多的時候關注的是對象層次的東西,在解決對象行為內部問題方面卻有些不足。AOP的出現恰恰就是對面向對象思想做出了完美的補充。
?????說到AOP,我們就不得不來提一下軟件的縱向和橫向問題。從縱向結構來看就是我們軟件系統的各個模塊,它主要負責處理我們的核心業務(例如商品訂購、購物車查看);而從橫向結構來看,我們幾乎每個系統又包含一些公共模塊(例如權限、日志模塊等)。這些公共模塊分布于我們各個核心業務之中(例如訂購和查看商品明細的過程都需要檢查用戶權限、記錄系統日志等)。這樣一來不僅在開發過程中要處處關注公共模塊的處理而且開發后維護起來也是十分麻煩。而有了AOP之后將應用程序中的商業邏輯同對其提供支持的通用服務進行分離,使得開發人員可以更多的關注核心業務開發。?
? ? ? ? ? ? ? ? ? ? ?
下面我們就以一個簡單的例子來看一下AOP吧!比如說,我們現在要開發的一個應用里面有很多的業務方法,但是,我們現在要對這個方法的執行做全面監控,或部分監控.也許我們就會在要一些方法前去加上一條日志記錄,我們寫個例子看看我們最簡單的解決方案
我們先寫一個接口IHello.java代碼如下:
[java]?view plaincopy print?
里面有個方法,用于輸入"Hello"?加傳進來的姓名;我們去寫個類實現IHello接口
現在我們要為這個業務方法加上日志記錄的業務 , 我們在不改變原代碼的情況下 , 我們會去怎么做呢 ? 也許 , 你會去寫一個類去實現 IHello 接口 , 并依賴 Hello 這個類 . 代碼如下 :
[java]?view plaincopy print?
??????從上面的代碼我們可以看出,hello對象是被HelloProxy這個所謂的代理態所創建的.這樣,如果我們以后要把日志記錄的功能去掉.那我們只要把得到hello對象的的具體實現改為Hello的就可以。上面的代碼?就是對AOP的最簡單的視線,但是我們接下來想,如果我們要在很多業務邏輯之前加日志的話,那么,我們是不是要去寫很多個HelloProxy這樣的類呢.沒錯,是的.其實也是一種很麻煩的事.在jdk1.3以后.jdk跟我們提供了一個API?java.lang.reflect.InvocationHandler的類.?這個類可以讓我們在JVM調用某個類的方法時動態的為些方法做些什么事.讓我們把以上的代碼改一下來看看效果.
同樣,我們寫一個IHello的接口和一個Hello的實現類.在接口中.我們定義兩個方法;代碼如下?:
IHello.java
[java]?view plaincopy print?
Hello.java
[java]?view plaincopy print?
我們一樣的去寫一個代理類.只不過.讓這個類去實現java.lang.reflect.InvocationHandler接口,代碼如下:
[java]?view plaincopy print?
? ? ? 從上面的例子我們看出.只要你是采用面向接口編程,那么,你的任何對象的方法執行之前要加上記錄日志的操作都是可以的.他(DynaPoxyHello)自動去代理執行被代理對象(Hello)中的每一個方法,一個java.lang.reflect.InvocationHandler接口就把我們的代理對象和被代理對象解藕了
from:?http://blog.csdn.net/csh624366188/article/details/7650150
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Java程序员从笨鸟到菜鸟之(七十三)细谈Spring(五)spring之AOP底层大揭秘的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java程序员从笨鸟到菜鸟之(七十)细谈
- 下一篇: Java程序员从笨鸟到菜鸟之(七十四)细