Fork me on GitHub

CGLIB动态代理

原理

  • 不管是静态代理还是jdk动态代理,代理的条件之一就是要求目标类和代理类实现同一业务接口;所以,对于无接口类的代理,我们就不能再用之前的代理方式;
  • CGLIB动态代理的生成原理是 生成目标类的子类,而子类是增强过的,即子类就是目标类的代理类 。所以,使用CGLIB动态代理,要求目标类必须能够被继承,即不能是final的类

实现

  1. 导入CDLIB的jar包:cglib-full.jar

  2. 定义目标类,不用实现任何接口

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class AccountService {

    //目标方法

    public void transfer(){

    System.out.println("转账!");

    }

    }
  1. 创建代理类的工厂,该类需实现MethodInterceptor接口

    1. 声明目标类的成员变量,并创建接受该参数的构造器
    2. 定义代理生成方法,用于创建代理对象,即目标类的子类
    3. 定义回调接口方法,在这里对目标类进行增强
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    public class AccountServiceCglibProxyFactory implements MethodInterceptor {

    //1. 声明目标类的成员变量,并创建接受该参数的构造器

    private AccountService targer;

    public AccountServiceCglibProxyFactory(AccountService targer) {
    this.targer = targer;
    }

    public AccountServiceCglibProxyFactory() {
    }

    //2. 定义代理生成方法,用于创建代理对象,即目标类的子类
    public AccountService createProxy(){
    //创建增强器
    Enhancer enhancer = new Enhancer();
    //初始化增强器,将目标类指定为父类
    enhancer.setSuperclass(AccountService.class);
    //初始化增强器,设置回调方法,因为MethodInterceptor接口继承自Callback,因此可以使用this
    enhancer.setCallback(this);
    //使用增强器创建代理对象
    return (AccountService) enhancer.create();
    }

    //3. 定义回调接口方法,在这里对目标类进行增强;
    //本类中调用了Enhance类的setCallback(this)方法,并将回调对象this作为实参传递给了Enhancer类;
    //Enhancer类在后续的执行过程中,会调用本类的intercept方法;
    //这个intercept()方法就是回调方法
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
    //若为transfer方法,则进行增强
    if("transfer".equals(method.getName())){
    //直接调用目标对象的业务方法执行
    Object result = method.invoke(targer, objects);
    return result;
    }
    return method.invoke(targer, objects);
    }
    }
  2. 定义客户类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class Client {
    public static void main(String[] args) {
    //创建目标对象
    AccountService target = new AccountService();
    //创建代理对象
    AccountService proxy = new AccountServiceCglibProxyFactory(target).createProxy();
    //执行增强后的业务方法
    proxy.transfer();
    }
    }
-------------本文结束感谢您的阅读-------------