Spring Boot中的代理模式

2023年 9月 17日 36.3k 0

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

1. 代理模式

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

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

2. JDK动态代理

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

使用示例:

  • 定义接口:
  • public interface OrderService {
        void placeOrder();
    }
    
  • 实现接口:
  • public class RealOrderService implements OrderService {
        @Override
        public void placeOrder() {
            System.out.println("Order placed successfully!");
        }
    }
    
  • 定义InvocationHandler:
  • 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;
        }
    }
    
  • 创建代理对象:
  • OrderService proxy = (OrderService) Proxy.newProxyInstance(
        RealOrderService.class.getClassLoader(),
        new Class[]{OrderService.class},
        new OrderServiceInvocationHandler(new RealOrderService())
    );
    proxy.placeOrder();
    

    3. CGLIB代理

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

    使用示例:

  • 创建一个普通类:
  • public class SimpleOrderService {
        public void placeOrder() {
            System.out.println("Order placed successfully!");
        }
    }
    
  • 使用CGLIB创建代理:
  • 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的工作机制。希望这篇文章能帮助你在实际项目中更加得心应手。

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论