动态代理是实现AOP的绝好底层技术。
JDK动态代理
主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。
InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一起。
Proxy利用InvocationHandler动态创建一个符合某一接口的实例,生成目标类的代理对象。
例子如下:
//目标类
public class ForumServiceImpl Implements ForumService{
public void removeTopic(int topicId) {
System.out.println("模拟删除Topic记录" + topicId);
try {
Thread.currentThread().sleep(20);
} catch(Exception e) {
throw new RuntimeException(e);
}
}
}
//InvocationHandler 编织目标业务类逻辑和横切逻辑代码
public class PerformanceHandler implements InvocationHandler {
private Object target;//目标业务类
public PerformanceHandler(Object target){
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
PerformanceMonitor.begin(
target.getClass().getName()+"."+Method.getName());
Object obj = method.invoke(target, args);//通过反射方法调用业务类的目标方法
PerformanceMonitor.end();
return obj;
}
}
//创建代理实例
public class TestForumService {
public static void main(String[] args) {
ForumService target = new ForumServiceImpl();//希望被代理的目标类
PerformanceHandler handler = new PerformanceHandler(target);//将目标业务类和横切代码类编织到一起
ForumService proxy = (ForumService)Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
handler);//根据编织了业务类逻辑和性能监视横切逻辑的InvocationHandler实例创建代理实例
proxy.removeTopic(10);//调用代理实例
}
}