kela的筆記 應(yīng)用程序框架 ---- spring(7)
Posted on 2006-08-29 16:35 Kela 閱讀(175) 評(píng)論(0) 編輯 收藏 所屬分類: 我的筆記(Spring)
摘要:Spring AOP ,從代理機(jī)制看AOP,動(dòng)態(tài)代理的范例
在JDK1.3之后加入了可協(xié)助開(kāi)發(fā)動(dòng)態(tài)代理功能的API,你不必為特定對(duì)象與方法編寫特定的代理對(duì)象,使用動(dòng)態(tài)代理,可以使用一個(gè)處理者(Handler)服務(wù)于各個(gè)對(duì)象。
●????
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
方法開(kāi)始執(zhí)行... ...");
???????????
??????????? result = method.invoke(delegate, args);
???????????
??????????? log.info("hello
方法執(zhí)行完畢");
??????? } 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();
??? }
}
●????
學(xué)習(xí)小結(jié)
使用代理對(duì)象將記錄等于業(yè)務(wù)邏輯無(wú)關(guān)的動(dòng)作或任務(wù)提取出來(lái),設(shè)計(jì)為一個(gè)服務(wù)對(duì)象,如LogHandler和上一小節(jié)中的HelloProxy,這樣的對(duì)象稱之為切面(Aspect)。