Java | Spring框架 | AOP代理机制

大家好,我是程序员影子,一名AI+编程深耕者,点击左上角头像了解我的详细信息。

今天来聊一聊关于Java中的Spring AOP代理机制中的JDK动态代理与CGLIB。

一、JDK动态代理

JDK动态代理是Spring AOP默认使用的代理机制。它基于Java反射机制,通过实现接口的方式来创建代理对象。

代码示例:
InvocationHandler实现

复制代码
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyInvocationHandler implements InvocationHandler {
    private Object target; // 目标对象
    public MyInvocationHandler(Object target) {
        this.target = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Before method: " + method.getName());
        Object result = method.invoke(target, args); // 调用目标对象的方法
        System.out.println("After method: " + method.getName());
        return result;
    }
}

使用JDK动态代理

复制代码
import java.lang.reflect.Proxy;
public class ProxyTest {
    public static void main(String[] args) {
        // 创建目标对象
        HelloWorld helloWorld = new HelloWorldImpl();
        
        // 创建InvocationHandler对象
        InvocationHandler handler = new MyInvocationHandler(helloWorld);
        
        // 创建代理对象
        HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance(
                helloWorld.getClass().getClassLoader(),
                helloWorld.getClass().getInterfaces(),
                handler);
        
        // 通过代理对象调用方法
        proxy.sayHello();
    }
}
interface HelloWorld {
    void sayHello();
}
class HelloWorldImpl implements HelloWorld {
    @Override
    public void sayHello() {
        System.out.println("Hello, World!");
    }
}

二、CGLIB代理

CGLIB是一个强大的、高性能的代码生成库。Spring AOP在创建代理对象时,如果目标对象没有实现接口,就会使用CGLIB来创建代理对象。

代码示例:
MethodInterceptor实现类

复制代码
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class MyMethodInterceptor implements MethodInterceptor {
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("Before method: " + method.getName());
        Object result = proxy.invokeSuper(obj, args); // 调用目标对象的方法
        System.out.println("After method: " + method.getName());
        return result;
    }
}

使用CGLIB代理

复制代码
import net.sf.cglib.proxy.Enhancer;
public class CglibTest {
    public static void main(String[] args) {
        // 创建Enhancer对象
        Enhancer enhancer = new Enhancer();
        
        // 设置目标类
        enhancer.setSuperclass(HelloWorldImpl.class);
        
        // 设置回调方法
        enhancer.setCallback(new MyMethodInterceptor());
        
        // 创建代理对象
        HelloWorldImpl proxy = (HelloWorldImpl) enhancer.create();
        
        // 通过代理对象调用方法
        proxy.sayHello();
    }
}
class HelloWorldImpl {
    public void sayHello() {
        System.out.println("Hello, World!");
    }
}

以上就是本次的分享,下面是影子为你带来的两份大礼。

一、欢迎加我的微信围观影子的AI编程玩法,你可以直接与影子交流,无论是Java领域还是AI编程玩法,影子都已深耕多年,期待与你的相遇~

二、加好友时备注 AI+编程,送你一份影子沉淀多个月的AI学习资料,帮助你快速入门。详细可参考下面的文章:

AI编程学习https://blog.csdn.net/yingzix688/article/details/137894050


最后影子再做个自我介绍:

AI+编程深耕者,致力于通过AI减少工作时间,提高开发效率,帮助小白早日踏进AIG的时代。

在影子这里,如果你是小白,你可以学习到AI+编程的入门玩法,帮助你解决一些编程开发的重复性问题;如果你有基础,影子可以给你提供进阶的知识,让你的AI+编程能力更进一步。

同时影子也会分享自己使用AI作为副业赚钱的经历。

影子的梦想是帮助更多编程小白入门AI+编程,而在即将到来的AIG时代,只会淘汰不会使用AI的编程者,希望能有更多的人可以在影子这里学习到AI编程的能力,在未来的AI时代中,不被淘汰。

相关推荐
七牛开发者8 分钟前
Coding Agent 如何跑稳长任务?从上下文管理到运行时状态
前端·javascript·后端
顿哥GPT11 分钟前
2026年8月AI编程实验:ChatGPT Plus / Pro + Codex 提示词粒度对重构质量与测试覆盖的影响
chatgpt·重构·ai编程
小小帅呀19 分钟前
学习VLA第3天:训练一个最简单的神经网络
人工智能·神经网络·学习
Zane199419 分钟前
遍历时删元素为什么报错:modCount 这个"计数器"在背后盯着你
java·后端
苍何25 分钟前
原来世界模型,已经能边玩边生成了
后端
七牛开发者26 分钟前
拆解 DeepSeek Harness:Profile 与 Bundle 如何装配运行时
前端·javascript·后端
HjhIron31 分钟前
从零搭建后端业务:数据库表设计、索引优化与部署架构解析
后端
Zane199436 分钟前
为什么 del 一个对象有时立刻消失,有时却纹丝不动?一文讲透引用计数与垃圾回收
后端·python
编码浪子40 分钟前
Rust 智能指针深度实战:Box/Rc/Arc/RefCell 选型决策与内存管理避坑
开发语言·后端·rust
m4Rk_1 小时前
【论文阅读】Agent 记忆机制(50):PACE——按下一步预测价值动态分配历史记忆粒度
论文阅读·人工智能·学习·开源·github