面试官问 Spring AOP 中两种代理模式的区别,我懵逼了( 三 )

4、客户端
public class Client {    public static void main(String[] args) {        Internet internet = new ProxyInternet(new RealInternet());        try {            internet.connectTo("360.cn");            internet.connectTo("qq.com");        } catch (Exception e) {            System.out.println(e.getMessage());        }    }}动态代理的方式中 , 所有的函数调用最终都会经过 invoke 函数的转发 , 因此我们就可以在这里做一些自己想做的操作 , 比如日志系统、事务、拦截器、权限控制等 。
cglib代理静态代理和 JDK 代理模式都要求目标对象实现一个接口 , 但有时候目标对象只是一个单独的对象 , 并没有实现任何接口 , 这个时候就可以使用目标对象子类来实现代理 , 这就是 cglib 代理 。

  • cglib(Code Generation Library)是一个基于ASM的字节码生成库 , 它允许我们在运行时对字节码进行修改和动态生成 。cglib 通过继承方式实现代理 。它广泛的被许多AOP的框架使用 , 比如我们的 Spring AOP 。
  • cglib 包的底层是通过使用字节码处理框架 ASM 来转换字节码并生成新的类 。
  • cglib 代理也被叫做子类代理 , 它是在内存中构建一个子类对象从而实现目标对象功能扩展 。
Coding添加 cglib 依赖
<dependency>    <groupId>cglib</groupId>    <artifactId>cglib</artifactId>    <version>3.3.0</version></dependency>1、不需要接口
public class RealInternet{    public void connectTo(String serverHost) {        System.out.println("Connecting to "+ serverHost);    }}2、代理工厂类
public class ProxyFactory implements MethodInterceptor {    private Object target;    public ProxyFactory(Object target){        this.target = target;    }    @Override    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {        System.out.println("cglib 代理开始 , 可以添加逻辑");        Object obj = method.invoke(target,objects);        System.out.println("cglib 代理结束");        return obj;    }    public Object getProxyInstance(){        //工具类 , 类似于JDK动态代理的Proxy类        Enhancer enhancer = new Enhancer();        //设置父类        enhancer.setSuperclass(target.getClass());        //设置回调函数        enhancer.setCallback(this);        //创建子类对象 , 即代理对象        return enhancer.create();    }}3、客户端
public class Client {    public static void main(String[] args) {        //目标对象        RealInternet target = new RealInternet();        //获取代理对象,并且将目标对象传递给代理对象        RealInternet internet = (RealInternet) new ProxyFactory(target).getProxyInstance();        internet.connectTo("so.cn");    }}4、输出
cglib 代理开始 , 可以添加逻辑Connecting to so.cncglib 代理结束


推荐阅读