摘要:Spring AOP ,從代理機制看AOP,靜態代理的范例。
?
在一個服務的流程中插入與業務邏輯無關的系統服務邏輯(比如 Logging、Security),這樣的邏輯稱為Cross-cutting concerns,將Cross-cutting concerns獨立出來設計為一個對象,這樣的特殊對象稱之為Aspect,Aspect-oriented programming著重在Aspect的設計及與應用程序的織入(Weave)。
?
●????
靜態代理
?
在靜態代理的實現中,代理對象與被代理對象都必須實現同一個接口,在代理對象中可以實現日志記錄等相關服務,并在需要的時候再呼叫被代理的對象,如此代理對象當中就可以僅保留業務相關職責。
●????
IHello.java
?
package com.kela.spring.aop;
?
public interface IHello {
??? public void hello(String name);
}
●????
HelloSpeaker.java
?
package com.kela.spring.aop;
?
public class HelloSpeaker implements IHello {
?
??? public void hello(String name) {
??????? System.out.println("
你好," + name);
??? }
}
●????
HelloProxy.java
?
package com.kela.spring.aop;
?
import org.apache.log4j.Logger;
?
public class HelloProxy implements IHello {
??? private Logger log = Logger.getLogger(this.getClass().getName());
???
??? private IHello helloObject;
???
??? public HelloProxy(IHello helloObject) {
??????? this.helloObject = helloObject;
??? }
???
??? public void hello(String name) {
??????? //
日志記錄
??????? log.info("hello
方法開始執行... ...");
??????? //
執行業務邏輯
??????? helloObject.hello(name);
??????? //
日志記錄
??????? log.info("hello
方法執行完畢");
??? }
}
●????
ProxyDemo.java
?
package com.kela.spring.aop;
?
public class ProxyDemo {
?
??? public static void main(String[] args) {
??????? HelloProxy proxy = new HelloProxy(new HelloSpeaker());
???????
??????? proxy.hello("KELA");
??? }
}
●????
運行結果
?
HelloProxy - hello
方法開始執行
... ...
?
你好,
KELA
HelloProxy - hello
方法執行完畢
?
●????
學習小結
?
靜態代理中,代理對象的一個接口只服務于一種類型的對象,而且如果要代理的方法很多,勢必要為每個方法進行代理,靜態代理在程序規模稍大時就無法勝任。