首页
技术小册
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 编程思想(下)
### 章节标题:AspectJ XML配置驱动实现 - `<aop:aspectj-autoproxy/>` 在Spring框架中,面向切面编程(AOP)是一种强大的技术,它允许开发者将横切关注点(如日志、事务管理等)从业务逻辑中分离出来,从而保持业务代码的清晰和可维护性。Spring AOP通过不同的方式实现AOP,其中之一就是通过AspectJ的注解支持,但本章节将专注于使用XML配置来驱动AspectJ的自动代理机制,特别是通过`<aop:aspectj-autoproxy/>`标签的使用。 #### 一、引言 `<aop:aspectj-autoproxy/>`是Spring AOP模块中用于启用AspectJ自动代理的关键配置元素。这个标签的加入,使得Spring能够自动识别并应用通过AspectJ注解定义的切面,而无需显式地在Spring配置文件中为每个bean声明代理。这种方式极大地简化了配置过程,使得AOP的集成更加平滑和高效。 #### 二、`<aop:aspectj-autoproxy/>`的基本用法 在Spring的XML配置文件中,`<aop:aspectj-autoproxy/>`标签应被放置在`<beans>`标签内部,但通常建议在`<context:component-scan/>`之后配置,以确保所有通过组件扫描发现的bean都能被正确代理。其基本使用方式如下: ```xml <beans ...> <!-- 组件扫描,确保Aspect类能被Spring容器识别 --> <context:component-scan base-package="com.example"/> <!-- 启用AspectJ自动代理 --> <aop:aspectj-autoproxy/> <!-- 其他bean定义 --> </beans> ``` 此配置告诉Spring框架,它应该自动检测并使用AspectJ的注解来创建代理对象,从而在不修改目标类代码的情况下,为它们添加额外的行为。 #### 三、高级配置选项 `<aop:aspectj-autoproxy/>`标签还提供了几个高级配置选项,允许开发者根据具体需求调整AOP代理的行为。 ##### 1. `proxy-target-class`属性 默认情况下,Spring AOP使用JDK动态代理来创建代理对象,这要求目标对象必须实现至少一个接口。如果目标对象没有实现任何接口,或者你想强制使用CGLIB代理(因为它比JDK代理更强大,能代理没有接口的类),可以设置`proxy-target-class="true"`: ```xml <aop:aspectj-autoproxy proxy-target-class="true"/> ``` ##### 2. `expose-proxy`属性 在某些情况下,你可能需要在切面内部访问当前代理对象本身,而不是目标对象。例如,你可能需要在切面的一个方法中调用同一个类的另一个方法,并希望这个调用也经过切面处理。通过设置`expose-proxy="true"`,Spring会暴露一个名为`org.springframework.aop.framework.AopContext`的ThreadLocal,你可以通过它来访问当前代理对象: ```xml <aop:aspectj-autoproxy expose-proxy="true"/> ``` 然后在切面中,你可以使用`AopContext.currentProxy()`来获取当前代理对象的引用。 ##### 3. `order`属性 当你有多个自动代理创建器(AdvisorAutoProxyCreator的实例,包括`<aop:aspectj-autoproxy/>`)时,可能需要指定它们的加载顺序。`order`属性允许你这样做,其值越小,表示优先级越高: ```xml <aop:aspectj-autoproxy order="0"/> ``` #### 四、示例:使用`<aop:aspectj-autoproxy/>`实现日志切面 假设我们有一个简单的日志切面,用于在方法执行前后记录日志: ```java @Aspect @Component public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore(JoinPoint joinPoint) { System.out.println("Before method: " + joinPoint.getSignature().getName()); } @After("execution(* com.example.service.*.*(..))") public void logAfter(JoinPoint joinPoint) { System.out.println("After method: " + joinPoint.getSignature().getName()); } } ``` 为了启用这个切面的自动代理,我们只需在Spring的XML配置文件中加入`<aop:aspectj-autoproxy/>`标签: ```xml <beans ...> <context:component-scan base-package="com.example"/> <aop:aspectj-autoproxy/> </beans> ``` 现在,每当`com.example.service`包下的任意类的任意方法被调用时,`LoggingAspect`中的`logBefore`和`logAfter`方法就会自动执行,实现日志记录的功能。 #### 五、总结 `<aop:aspectj-autoproxy/>`是Spring AOP中用于启用AspectJ自动代理的关键配置元素。通过简单的配置,它允许开发者利用AspectJ的注解来定义切面,而无需手动配置代理对象,从而简化了AOP的集成过程。此外,通过其提供的高级配置选项,如`proxy-target-class`、`expose-proxy`和`order`,开发者可以根据具体需求灵活调整AOP代理的行为。掌握这些配置技巧,将有助于你在项目中更有效地利用Spring AOP的强大功能。
上一篇:
AspectJ Enable模块驱动实现 - @EnableAspectJAutoProxy
下一篇:
AOP配置Schema-based 实现 - <aop:config/>
该分类下的相关小册推荐:
Java语言基础5-面向对象初级
Java面试指南
Java并发编程实战
Java语言基础13-类的加载和反射
SpringBoot零基础到实战
深入拆解 Java 虚拟机
Java语言基础2-运算符
JAVA 函数式编程入门与实践
Mybatis合辑2-Mybatis映射文件
java源码学习笔记
Mybatis合辑1-Mybatis基础入门
Java语言基础1-基础知识