1.1 CGLib代理
CGLib代理主要涉及spring-core-4.xjar包中的三个类:Enhancer,MethodInterceptor和MethodProxy。其中MethodInterceptor是spring自带的拦截接口,可以通过实现该接口,定义intercept方法拦截。而Enhancer是spring自带的类,通过字节码技术动态创建子类实例。代理类具体代码如下:
package designMode;
import designCommon.PerfomanceMonitor;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
* Created by Administrator on 2021/2/7 0007.
*/
public class CglibProxy implements MethodInterceptor {
private Enhancer enhancer=new Enhancer();
//1.创建需要代理对象的实例
public Object getProxy(Class clazz){
//1.1设置需要创建子类的类
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
//1.2通过字节码技术动态创建子类实例
return enhancer.create();
}
//2.拦截父类所有方法的调用
//obj表示目标类的实例,method表示目标类的方法反射对象,args表示目标方法的动态入参,methodProxy为代理对象的实例
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
PerfomanceMonitor.begin(obj.getClass().getName()+"."+method.getName());
Object result= methodProxy.invokeSuper(obj,args);
PerfomanceMonitor.end();
return result;
}
}
测试类代码如下:
package test;
import bizServiceImpl.ForumServiceImpl;
import designMode.CglibProxy;
/**
* Created by Administrator on 2021/2/7 0007.
*/
public class ForumServiceImplProxyTest {
public static void main(String[] args) {
CglibProxy proxy=new CglibProxy();
ForumServiceImpl forumService=(ForumServiceImpl)proxy.getProxy(ForumServiceImpl.class);
forumService.removeTopic("1024");
}
}
其他类的代码:
package bizServiceImpl;
import bizService.ForumService;
/**
* Created by Administrator on 2021/2/7 0007.
*/
public class ForumServiceImpl implements ForumService {
@Override
public void removeTopic(String topicId) {
//开始对该方法进行监视
// PerfomanceMonitor.begin("bizServiceImpl.ForumServiceImpl.removeTopic");
System.out.println("模拟删除Topic记录:"+topicId);
try{
Thread.currentThread().sleep(20);
}catch(Exception e){
throw new RuntimeException();
}
// PerfomanceMonitor.end();
}
}
1.2缺点:
采用动态创建子类的方式生成子类对象,所以不能对目标类中的final或private方法进行代理。