Spring Boot中的代理模式

代理模式作为一种重要的设计模式,在Spring Boot中的应用非常广泛。接下来,我们将详细讨论这种模式,并对JDK动态代理和CGLIB进行深入探讨。

1. 代理模式

定义: 为其他对象提供一种代理,从而控制对这个对象的访问。

示例:想象一个电商系统,在用户下订单后,会有一个订单服务处理这个请求。但在处理前,可能还需要一系列的操作,如安全验证、日志记录等。代理模式可以将这些附加操作与实际的订单服务解耦。

2. JDK动态代理

原理: JDK动态代理的核心是Proxy类和InvocationHandler接口。

使用示例:

  1. 定义接口:
java 复制代码
public interface OrderService {
    void placeOrder();
}
  1. 实现接口:
java 复制代码
public class RealOrderService implements OrderService {
    @Override
    public void placeOrder() {
        System.out.println("Order placed successfully!");
    }
}
  1. 定义InvocationHandler:
java 复制代码
public class OrderServiceInvocationHandler implements InvocationHandler {
    private Object target;

    public OrderServiceInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Before placing order...");
        Object result = method.invoke(target, args);
        System.out.println("After placing order...");
        return result;
    }
}
  1. 创建代理对象:
java 复制代码
OrderService proxy = (OrderService) Proxy.newProxyInstance(
    RealOrderService.class.getClassLoader(),
    new Class[]{OrderService.class},
    new OrderServiceInvocationHandler(new RealOrderService())
);
proxy.placeOrder();

3. CGLIB代理

原理: CGLIB通过继承目标类并重写方法的方式实现代理。

使用示例:

  1. 创建一个普通类:
java 复制代码
public class SimpleOrderService {
    public void placeOrder() {
        System.out.println("Order placed successfully!");
    }
}
  1. 使用CGLIB创建代理:
java 复制代码
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(SimpleOrderService.class);
enhancer.setCallback(new MethodInterceptor() {
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("Before placing order...");
        Object returnValue = proxy.invokeSuper(obj, args);
        System.out.println("After placing order...");
        return returnValue;
    }
});

SimpleOrderService proxy = (SimpleOrderService) enhancer.create();
proxy.placeOrder();

4. Spring Boot中的应用

Spring AOP就是基于上述两种代理方式实现的。当你为Spring组件定义一个切面时,Spring将为被代理的组件创建一个代理对象。默认情况下,如果目标对象实现了接口,Spring会使用JDK动态代理;否则,使用CGLIB。

结论

通过深入理解代理模式及其在Spring Boot中的应用,我们可以更好地掌握Spring的工作机制。希望这篇文章能帮助你在实际项目中更加得心应手。

相关推荐
程序员飞哥2 分钟前
AI 编程额度怎么用才不浪费?
java·前端·后端
yh弓长8 分钟前
Spring MVC 的请求链路
java·spring·mvc
拆房老料9 分钟前
【第四部分:Agentic 智能体设计模式】17. Agent 路由模式详解:从意图识别到动态模型选择
java·设计模式·ai编程·策略模式
狂师10 分钟前
GitHub 上最值得装的 8 个 Agent Skill 仓库,亲测好用!
程序员·github·ai编程
樱花落木兰21 分钟前
Redis 消息队列的可靠性演进:从 List、Pub/Sub 到 Stream 消费者组,以及 8.x 版本改变了什么
java·开发语言·经验分享·redis·分布式·python·软件工程
学长毕设24 分钟前
基于SpringBoot的文具商城在线零售系统-附源码
spring boot·后端·零售
wtblszn41 分钟前
凹版印刷机智慧运维物联网系统方案
java·运维·物联网
Nuanyt44 分钟前
LeetCode Hot 100 链表专题(四)· 3 题(Java)
java·算法·leetcode·链表·双指针
zhongben_keji1 小时前
本地生活 APP 开发:城市 × 品类 × 履约形态的三维网格与三套账
java·大数据·生活
code2cat3 小时前
Java工具篇之Maven:从pom.xml到测试通过的JAR
xml·java·maven