Spring AOP Cglib 动态代理

我是研究僧i 提交于 2020-02-26 17:11:12

0、可以代理没有接口的实现类

1、被代理类

/**
 * 被代理类
 */
public class Cat {
   
    public void cry() {
        System.out.println("喵喵喵");
    }
}

2、实现MethodInterceptor接口

import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * 实现MethodInterceptor接口
 */
public class CatMethodInterceptor implements MethodInterceptor {

    /**
     * 生成方法拦截器
     * @param o 要进行增强的对象
     * @param method 拦截的方法
     * @param objects 参数列表
     * @param methodProxy 方法的代理
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object o, Method method, 
                            Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("——————调用前处理——————");
        //对被代理对象方法的调用
        Object object = methodProxy.invokeSuper(o, objects);
        System.out.println("——————调用后处理——————");
        return object;
    }
}

3、测试

import org.springframework.cglib.proxy.Enhancer;

/**
 * 测试Cglib
 */
public class CglibDynamicProxyDemo {

    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        //被代理类:Cat
        enhancer.setSuperclass(Cat.class);
        //设置回调
        enhancer.setCallback(new CatMethodInterceptor());
        //生成代理对象
        Cat cat = (Cat) enhancer.create();
        //调用代理类的方法
        cat.cry();
    }
}

4、运行结果

——————调用前处理——————
喵喵喵
——————调用后处理——————

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!