摘要:Spring AOP ,從代理機制看AOP,動態代理的范例
?
在JDK1.3之后加入了可協助開發動態代理功能的API,你不必為特定對象與方法編寫特定的代理對象,使用動態代理,可以使用一個處理者(Handler)服務于各個對象。
?
●????
LogHandler.java
?
package com.kela.spring.aop;
?
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
?
import org.apache.log4j.Logger;
?
public class LogHandler implements InvocationHandler {
?
??? private Logger log = Logger.getLogger(this.getClass().getName());
???
??? private Object delegate;
???
??? public Object bind(Object delegate) {
??????? this.delegate = delegate;
??????? return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().getInterfaces(), this);
??? }
??? public Object invoke(Object arg0, Method method, Object[] args)
??????????? throws Throwable {
??????? Object result = null;
???????
??????? try {
??????????? log.info("hello
方法開始執行... ...");
???????????
??????????? result = method.invoke(delegate, args);
???????????
??????????? log.info("hello
方法執行完畢");
??????? } catch (Exception e) {
??????????? System.out.println("[ERROR]" + e.getMessage());
??????? }
??????? return result;
??? }
?
}
●????
IHell.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);
??? }
}
●????
ProxyDemo.java
?
package com.kela.spring.aop;
?
public class ProxyDemo {
???
??? public void method_2() {
??????? LogHandler logHandler = new LogHandler();
???????
??????? IHello helloProxy = (IHello)logHandler.bind(new HelloSpeaker());
???????
??????? helloProxy.hello("kela");
??? }
?
??? public static void main(String[] args) {
??????? ProxyDemo proxyDemo = new ProxyDemo();
???????
??????? proxyDemo.method_2();
??? }
}
●????
學習小結
?
使用代理對象將記錄等于業務邏輯無關的動作或任務提取出來,設計為一個服務對象,如LogHandler和上一小節中的HelloProxy,這樣的對象稱之為切面(Aspect)。