接下來(lái)學(xué)習(xí)有關(guān)AOP,首先了解有關(guān)代理機(jī)制(Spring實(shí)現(xiàn)AOP的一種方式)。代理分為兩種:靜態(tài)代理與動(dòng)態(tài)代理。
通過(guò)一個(gè)例子來(lái)了解靜態(tài)代理。
Lib包下載:
http://www.ziddu.com/download/3555992/SpringAndaop.rar.html
(1)一個(gè)簡(jiǎn)單的接口IHello
package com.proxy;
/**
* 接口
*
* **/
public interface IHello {
public void hello(String name);
}
(2)實(shí)現(xiàn)類(lèi)HelloSpeaker
package com.proxy;
public class HelloSpeaker implements IHello{
public void hello(String name) {
System.out.println("Hello,"+name);
}
}
(3)代理類(lèi)HelloProxy
package com.proxy;
import java.util.logging.*;
/**
* 靜態(tài)代理類(lèi),代理真正的實(shí)現(xiàn)類(lèi)HelloSpeaker來(lái)執(zhí)行
*
* */
public class HelloProxy implements IHello{
private Logger logger=Logger.getLogger(this.getClass().getName());
private IHello helloObject;//接口聲明
//構(gòu)造函數(shù)
public HelloProxy(IHello helloObject)
{
this.helloObject=helloObject;
}
//接口實(shí)現(xiàn)方法
public void hello(String name)
{
log("hello methods starts...");
helloObject.hello(name);
log("hello methods ends...");
}
private void log(String msg)
{
logger.log(Level.INFO,msg);
}
}
(4)測(cè)試類(lèi)ProxyDemo
package com.proxy;
public class ProxyDemo {
public static void main(String[] args)
{
//靜態(tài)代理模式
HelloProxy proxy=new HelloProxy(new HelloSpeaker());
proxy.hello("ducklyl");
}
}
運(yùn)行測(cè)試類(lèi),結(jié)果為:
Hello,ducklyl
2007-10-28 10:52:26 com.proxy.HelloProxy log
信息: hello methods starts...
2007-10-28 10:52:27 com.proxy.HelloProxy log
信息: hello methods ends...
接下來(lái)介紹動(dòng)態(tài)代理
(1)創(chuàng)建動(dòng)態(tài)代理類(lèi)LogHandler
package com.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.logging.*;
/**
*
* 動(dòng)態(tài)代理類(lèi)
* **/
public class LogHandler implements InvocationHandler {
private Logger logger = Logger.getLogger(this.getClass().getName());
private Object delegate;
public LogHandler()
{
}
public Object bind(Object delegate) {
this.delegate = delegate;
log("bind starts...");
return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),
delegate.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
try {
log("method starts..." + method);
result = method.invoke(delegate, args);
log("method ends..." + method);
} catch (Exception e) {
log(e.toString());
}
return null;
}
private void log(String msg) {
logger.log(Level.INFO, msg);
}
}
(2)創(chuàng)建測(cè)試類(lèi)ProxyTest
package com.proxy;
public class ProxyTest {
public static void main(String[] args)
{
LogHandler logHandler=new LogHandler();
//logHandler代理HelloSpeaker實(shí)例,調(diào)用hello
IHello helloProxy=(IHello)logHandler.bind(new HelloSpeaker());
helloProxy.hello("ducklyl");
}
}
運(yùn)行測(cè)試類(lèi),結(jié)果為:
Hello,ducklyl
2007-10-28 11:24:59 com.proxy.LogHandler log
信息: bind starts...
2007-10-28 11:24:59 com.proxy.LogHandler log
信息: method starts...public abstract void com.proxy.IHello.hello(java.lang.String)
2007-10-28 11:24:59 com.proxy.LogHandler log
信息: method ends...public abstract void com.proxy.IHello.hello(java.lang.String)