@(aop)[jdk,cglib]
JDK 动态代理
CGLib动态代理
- 通过JDK的动态代理 你需要做的是先声明一个动作接口(代理接口)、实现类、代理生成类
- 通过代码可以知道JDK的动态代理必须要接口和实现类这样的搭配组合,而CGLib动态代理则没有这个要求
- CGLib的代理原理大致就是通过字节码在基础类(委托类)的基础上动态生成一个子类,在子类上实现代理。
实现的代码如下:
基础类:
package com.lemontree.spring.service;
public class CgService {
public void say(){
System.out.println("CgService hello");
}
public void miss(){
System.out.println("miss game");
}
}
代理类:
package com.lemontree.spring.aop;
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 CglibProxy implements MethodInterceptor {
private Enhancer enhancer = new Enhancer();
public Object getProxy(Class clazz) {
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
}
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy)
throws Throwable {
System.out.println("start...");
Object result = proxy.invokeSuper(obj, args);
System.out.println("end...");
return result;
}
}
测试:
public class Test {
public static void main(String[] args) throws IOException {
CgService cgService = (CgService) cglibProxy.getProxy(CgService.class);
cgService.say();
cgService.miss();
}
}