- 我们知道,使用 jdk 创建的动态代理,其目标对象需要实现一个接口,当目标对象,即需要进行动态代理的对象没有实现接口时,便无法使用 jdk 的动态代理,此时我们可以考虑使用 cglib 动态代理来组织我们的业务逻辑织入,使用 cglib 动态代理类似于 jdk 动态代理,不过 jdk 是实现 InvocationHandler,而 cglib 是实现 MethodInterceptor,底层都是对于字节码的处理。(使用 cglib 动态代理需要导入 cglib.jar 和 asm.jar)
- 简单实现,http://blog.csdn.net/yakoo5/article/details/9099133/
① 创建一个需要被代理的目标对象,通过字节码技术创建这个类的子类
package demo4.cglib;
public class SayHello {
public void say() {
System.out.println("hello everyone");
}
}
② 创建动态代理的工具类
package demo4.cglib;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CglibProxy implements MethodInterceptor
{
private Enhancer enhancer = new Enhancer();
public Object getProxy(Class clazz){
//设置需要创建子类的类
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
//通过字节码技术动态创建子类实例
return enhancer.create();
}
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
// TODO Auto-generated method stub
System.out.println("前置代理");
//通过代理类调用父类中的方法
Object result = proxy.invokeSuper(obj, args);
System.out.println("后置代理");
return result;
}
}
③ 验证 cglib 是否织入成功
package demo4.cglib;
public class DoCGLib {
public static void main(String[] args) {
CglibProxy proxy = new CglibProxy();
//通过生成子类的方式创建代理类
SayHello proxyImp = (SayHello)proxy.getProxy(SayHello.class);
proxyImp.say();
}
}
④ 控制台输出
前置代理
hello everyone
后置代理