介绍

Spring动态代理可以选择使用jdk动态代理, 或者cglib动态代理, cglib动态代理位于 net.sf.cglib.proxy 包下.
使用时涉及
接口: net.sf.cglib.proxy.MethodInterceptor
用来生成动态子类的类类: net.sf.cglib.proxy.Enhancer
注意: cglib 动态代理是基于类的代理, 是通过对指定的业务类生成一个子类, 并覆盖其中业务方法实现代理. 因为使用继承, 所以被代理类不能使 final 修饰

使用步骤

1.创建MethodInterceptor接口的实现类, 并编写intercept方法的实现
2.通过methodProxy.invokeSuper(o, objects);调用父类的方法
3.创建Enhancer, 通过 setSuperclass(Class superclass)方法指定父类(被代理类), 通过 setCallback(final Callback callback)方法指定代理
4.enhancer.create() 生成代理, 调用被代理类的方法

代码演示

按照步骤编写简易逻辑代码.

创建MethodInterceptor接口的实现类

  1. /**
  2. * 基于类的代理 即使类没有实现接口也可以被代理
  3. * 主要是基于类生成一个继承的子类 所以 类和方法不要声明为 final
  4. *
  5. *
  6. * @author liuzhihang
  7. * @date 2018/5/18 10:10
  8. */
  9. public class MyMethodInterceptor implements MethodInterceptor {
  10. @Override
  11. public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
  12. System.out.println("cglib动态代理 before . . .");
  13. Object invoke = null;
  14. try {
  15. invoke = methodProxy.invokeSuper(o, objects);
  16. } catch (Throwable throwable) {
  17. throwable.printStackTrace();
  18. System.err.println("cglib动态代理 error: " + throwable.getMessage());
  19. } finally {
  20. System.out.println("cglib动态代理 after . . .");
  21. }
  22. return invoke;
  23. }
  24. }

创建Enhancer

创建Enhancer, 通过 setSuperclass(Class superclass)方法指定父类(被代理类), 通过 setCallback(final Callback callback)方法指定代理

  1. public class CglibMainTest {
  2. public static void main(String[] args) {
  3. Enhancer enhancer = new Enhancer();
  4. enhancer.setSuperclass(SubjectCglib.class);
  5. enhancer.setCallback(new MyMethodInterceptor());
  6. SubjectCglib subjectCglib = (SubjectCglib) enhancer.create();
  7. System.err.println(subjectCglib.getAge("liuzhihang"));
  8. }
  9. }

可以将二者合并到MyInterceptor中

  1. /**
  2. * 基于类的代理 即使类没有实现接口也可以被代理
  3. *
  4. *
  5. * @author liuzhihang
  6. * @date 2018/5/18 10:10
  7. */
  8. public class MyCglibInterceptor implements MethodInterceptor {
  9. private Object object;
  10. public Object getInstance(Object object) {
  11. this.object = object;
  12. Enhancer enhancer = new Enhancer();
  13. enhancer.setSuperclass(object.getClass());
  14. enhancer.setCallback(this);
  15. return enhancer.create();
  16. }
  17. @Override
  18. public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
  19. System.out.println("cglib动态代理 before . . .");
  20. Object invoke = null;
  21. try {
  22. invoke = methodProxy.invokeSuper(o, objects);
  23. } catch (Throwable throwable) {
  24. throwable.printStackTrace();
  25. System.err.println("cglib动态代理 error: " + throwable.getMessage());
  26. } finally {
  27. System.out.println("cglib动态代理 after . . .");
  28. }
  29. return invoke;
  30. }
  31. }