方式一:JDK
1.业务逻辑接口和实现类
public interface ForumService {
void removeTopic(String topicID);
}
实现类:
public class ForumServiceImpl implements ForumService{
public void removeTopic(String topicId){
System.out.println("删除ID为"+topicId+"的topic信息");
}
}
2.切面逻辑类,无关业务
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* 纯切面逻辑
*JDK代理需要切面实现InvocationHandler
*/
public class QieMianHandler implements InvocationHandler {
private Object target;
public QieMianHandler(Object target){
this.target=target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
PerformanceMonitor.begin(target.getClass().getName()+"."+method.getName());
Object object=method.invoke(target,args);
PerformanceMonitor.end();
return object;
}
}
public class PerformanceMonitor {
private static ThreadLocal<Performance> th=new ThreadLocal<>();
public static void begin(String method){
System.out.println("方法开始执行");
Performance performance=new Performance(method);
th.set(performance);
}
public static void end(){
System.out.println("方法执行完毕");
Performance performance=th.get();
performance.printTotalTime();
}
}
public class Performance {
private long beginDate;
private long endDate;
private String method;
public Performance(String method){
this.method=method;
beginDate=System.currentTimeMillis();
}
public void printTotalTime(){
endDate=System.currentTimeMillis();
System.out.println(method+"方法一共执行了"+(endDate-beginDate)+"毫秒");
}
}
3.创建代理类实例
@org.junit.Test
public void test2(){
ForumService forumService=new ForumServiceImpl();
QieMianHandler qieMian=new QieMianHandler(forumService);
//创建代理实例,并进行方法调用
ForumService proxy=(ForumService)Proxy.newProxyInstance(forumService.getClass().getClassLoader()
,forumService.getClass().getInterfaces(),qieMian);
proxy.removeTopic("test_1");
}
Proxy.newProxyInstance方法的三个参数:1.类加载器,2。为创建代理实例所需要实现的一组接口;3.整合业务逻辑和切面的编织起对象,编织起对象要实现InvocationHandler
以上就是JDK代理技术的简单实现。
方式二:
CGLib代理的实现:需要实现 MethodInterceptor接口
package com.pactera.workflow.test;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CglibInterceptor implements MethodInterceptor {
private Enhancer enhancer=new Enhancer();
public Object getProxy(Class clzz){
enhancer.setSuperclass(clzz);
enhancer.setCallback(this);
return enhancer.create();
//下面这种写法是错误的,返回enhancer和enhancer.create()是不一样的
// return enhancer;
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
PerformanceMonitor.begin(o.getClass().getName()+"."+method.getName());
Object obj=methodProxy.invokeSuper(o,objects);
PerformanceMonitor.end();
return obj;
}
}
测试:
@org.junit.Test
public void test3(){
CglibInterceptor cglib=new CglibInterceptor();
ForumServiceImpl obj=(ForumServiceImpl)cglib.getProxy(ForumServiceImpl.class);
obj.removeTopic("removeId");
obj.addTopic("addId");
}