首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
CGLIB AopProxy实现 - CglibAopProxy
AopProxyFactory配置管理器 - AdvisedSupport
Advisor链工厂接口与实现 - AdvisorChainFactory
目标对象来源接口与实现 - TargetSource
代理对象创建基础类 - ProxyCreatorSupport
AdvisedSupport事件监听器 - AdvisedSupportListener
ProxyCreatorSupport标准实现 - ProxyFactory
ProxyCreatorSupport IoC容器实现 - ProxyFactoryBean
ProxyCreatorSupport AspectJ实现 - AspectJProxyFactory
IoC容器自动代理抽象 - AbstractAutoProxyCreator
IoC容器自动代理标准实现
IoC容器自动代理 AspectJ 实现 - AspectJAwareAdvisorAutoProxyCreator
AOP Infrastructure Bean接口 - AopInfrastructureBean
AOP上下文辅助类 - AopContext
代理工厂工具类 - AopProxyUtils
AOP工具类 - AopUtils
AspectJ Enable模块驱动实现 - @EnableAspectJAutoProxy
AspectJ XML配置驱动实现 -
AOP配置Schema-based 实现 -
Aspect Schema-based实现 -
Pointcut Schema-based实现 -
Around Advice Schema-based实现 -
Before Advice Schema-based实现 -
After Advice Schema-based实现 -
After Returning Advice Schema-based实现 -
After Throwing Advice Schema-based实现 -
Adviser Schema-based实现 -
Introduction Schema-based实现 -
作用域代理Schema-based实现 -
抽象工厂模式(Abstract factory)实现
构建器模式(Builder)实现
工厂方法模式(Factory method)实现
原型模式(Prototype)实现
单例模式(Singleton)实现
适配器模式(Adapter)实现
组合模式(Composite)实现
装饰器模式(Decorator)实现
享元模式(Flyweight)实现
代理模式(Proxy)实现
模板方法模式(Template Method)实现
责任链模式(Chain of Responsibility)实现
观察者模式(Observer)实现
策略模式(Strategy)实现
命令模式(Command)实现
状态模式(State)实现
Spring AOP在 Spring 事件(Events)
Spring AOP在Spring 事务(Transactions)理论基础
Spring AOP在Spring 事务(Transactions)源码分析
Spring AOP在Spring 缓存(Caching)
Spring AOP在Spring本地调度(Scheduling)
当前位置:
首页>>
技术小册>>
Spring AOP 编程思想(下)
小册名称:Spring AOP 编程思想(下)
### 代理模式(Proxy)实现 在Spring AOP(面向切面编程)的深入探讨中,代理模式(Proxy Pattern)作为其核心技术之一,扮演着至关重要的角色。代理模式是一种设计模式,它为其他对象提供一种代理以控制对这个对象的访问。在Spring AOP的上下文中,代理模式被用于在不修改源代码的情况下,为应用程序添加额外的行为(如事务管理、安全检查、日志记录等),这些行为通常被称为切面(Aspect)。本章将详细探讨代理模式在Spring AOP中的实现原理、分类、以及实际应用。 #### 一、代理模式概述 代理模式属于结构型设计模式,它创建了一个代表(即代理)对象,用于控制对某个实际对象的访问。代理对象可以在客户端和目标对象之间起到中介的作用,并且可以根据需要添加额外的功能。代理模式通常涉及三个角色: - **抽象主题(Subject)**:声明了真实主题和代理的共同接口,这样在任何使用真实主题的地方都可以使用代理。 - **真实主题(Real Subject)**:定义了代理所代表的真实对象,是代理控制访问的真实对象。 - **代理(Proxy)**:代理类持有一个对真实主题的引用,并可以在执行真实主题前后添加额外的操作。 #### 二、Spring AOP中的代理实现 在Spring AOP中,代理是实现AOP功能的关键。Spring提供了两种代理机制:JDK动态代理和CGLib代理,它们分别适用于不同的场景。 ##### 1. JDK动态代理 JDK动态代理是Java原生支持的一种代理方式,它利用`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。JDK动态代理要求被代理的类必须实现至少一个接口,因为它通过接口来创建代理实例。 **实现步骤**: 1. **定义接口**:首先定义一个或多个接口,这些接口将被代理类实现。 2. **创建实现InvocationHandler的类**:该类的`invoke`方法将包含调用原始方法之前的预处理逻辑和之后的后续处理逻辑。 3. **使用Proxy.newProxyInstance方法创建代理实例**:该方法接受三个参数——类加载器、接口数组和InvocationHandler实现类的实例。 **优点**: - 简单易用,无需引入第三方库。 - 代理对象与目标对象实现了相同的接口,对客户端完全透明。 **缺点**: - 只能代理实现了接口的类。 ##### 2. CGLib代理 CGLib(Code Generation Library)是一个强大的、高性能的代码生成库,用于在运行时扩展Java类和实现接口。与JDK动态代理不同,CGLib可以代理没有实现接口的类,它通过继承被代理类来创建代理对象。 **实现步骤**: 1. **添加CGLib依赖**:在项目中引入CGLib库。 2. **创建Enhancer对象**:Enhancer是CGLib中的一个类,用于生成代理对象。 3. **设置Superclass**:通过Enhancer的`setSuperclass`方法指定被代理的类。 4. **设置Callback**:通过Enhancer的`setCallback`方法设置回调接口,该接口的实现将包含代理逻辑。 5. **创建代理对象**:调用Enhancer的`create`方法生成代理对象。 **优点**: - 可以代理没有实现接口的类。 - 性能上可能优于JDK动态代理(尤其是在代理类较多时)。 **缺点**: - 需要额外引入CGLib库。 - 代理对象是通过继承被代理类创建的,可能会破坏被代理类的封装性(如final方法无法被代理)。 #### 三、Spring AOP中的代理选择 Spring AOP默认会根据被代理对象是否实现了接口来选择使用JDK动态代理还是CGLib代理。如果被代理对象实现了至少一个接口,则Spring AOP会优先使用JDK动态代理;否则,将使用CGLib代理。 然而,开发者也可以通过配置来显式指定使用哪种代理方式。例如,在Spring Boot应用中,可以通过设置`spring.aop.proxy-target-class`属性来控制: - `spring.aop.proxy-target-class=false`:强制使用JDK动态代理。 - `spring.aop.proxy-target-class=true`:强制使用CGLib代理。 #### 四、代理模式在Spring AOP中的应用实例 假设有一个服务层接口`UserService`及其实现类`UserServiceImpl`,我们需要为所有的用户服务方法添加日志记录功能。 **步骤**: 1. **定义切面和通知**:创建一个切面类,在该类中定义日志记录的通知(如前置通知、后置通知等)。 2. **配置切点**:在切面类中指定哪些方法需要被增强(即添加额外的行为),这通常通过切点表达式完成。 3. **应用代理**:Spring AOP在运行时根据配置自动创建代理对象,并在调用目标方法时应用通知。 **示例代码**: ```java @Aspect @Component public class LoggingAspect { @Before("execution(* com.example.service.UserService.*(..))") public void logBefore(JoinPoint joinPoint) { System.out.println("Before method: " + joinPoint.getSignature().getName()); } @After("execution(* com.example.service.UserService.*(..))") public void logAfter(JoinPoint joinPoint) { System.out.println("After method: " + joinPoint.getSignature().getName()); } } @Service public class UserServiceImpl implements UserService { // 实现UserService接口的方法 } ``` 在上述示例中,`LoggingAspect`是一个切面,它定义了日志记录的通知。当Spring容器启动时,Spring AOP会自动为`UserServiceImpl`类创建代理对象,并在调用其方法时插入日志记录的逻辑。 #### 五、总结 代理模式在Spring AOP中扮演了至关重要的角色,它使得在不修改原有代码的情况下,能够灵活地为应用程序添加额外的功能。通过JDK动态代理和CGLib代理,Spring AOP能够应对不同的代理需求,为开发者提供了强大的AOP支持。在实际开发中,正确理解和应用代理模式,将有助于提高代码的可维护性、可扩展性和复用性。
上一篇:
享元模式(Flyweight)实现
下一篇:
模板方法模式(Template Method)实现
该分类下的相关小册推荐:
Java语言基础7-Java中的异常
Java必知必会-Maven初级
Java语言基础11-Java中的泛型
Java语言基础8-Java多线程
Java语言基础14-枚举和注解
Mybatis合辑1-Mybatis基础入门
SpringBoot合辑-初级篇
java源码学习笔记
Java必知必会-JDBC
Java语言基础1-基础知识
Java并发编程
Java面试指南