首页
技术小册
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 Enable模块驱动实现 - `@EnableAspectJAutoProxy` 在Spring框架中,面向切面编程(AOP, Aspect-Oriented Programming)是一种强大的编程范式,它允许开发者将横切关注点(如日志、事务管理等)从业务逻辑中分离出来,从而提高代码的可维护性和模块化。Spring AOP通过Spring的IoC容器和动态代理技术实现了AOP,而AspectJ则是一个更全面的AOP框架,提供了编译时和加载时的织入(Weaving)选项。Spring通过集成AspectJ的功能,使得在Spring应用中能够方便地利用AspectJ的注解和语法。 `@EnableAspectJAutoProxy`注解是Spring框架中用于启用AspectJ自动代理的核心注解之一,它使得Spring容器能够自动识别并使用AspectJ注解的切面(Aspect)。本章节将深入解析`@EnableAspectJAutoProxy`的工作原理、配置选项以及如何在Spring应用中有效地利用它来实现AOP。 #### 一、`@EnableAspectJAutoProxy`概述 `@EnableAspectJAutoProxy`是Spring框架提供的一个注解,用于在配置类上启用AspectJ自动代理功能。当这个注解被添加到配置类上时,Spring容器会扫描并注册所有带有`@Aspect`注解的bean,并将它们作为切面处理。此外,Spring还会根据这些切面的定义自动为需要被增强的bean创建代理对象,从而在不修改业务代码的情况下,实现对业务逻辑的增强。 #### 二、`@EnableAspectJAutoProxy`的工作原理 ##### 1. 代理机制 Spring AOP默认使用JDK动态代理或CGLIB代理来创建被增强对象的代理实例。具体使用哪种代理机制,取决于被代理对象的类型: - 如果被代理对象实现了至少一个接口,Spring会优先选择JDK动态代理。 - 如果被代理对象没有实现任何接口,Spring则使用CGLIB来创建代理。 `@EnableAspectJAutoProxy`注解并不直接控制代理机制的选择,但它是启动整个AOP自动代理过程的开关。 ##### 2. 切面与通知的识别 Spring通过`@Aspect`注解识别切面,并通过AspectJ的注解(如`@Before`、`@After`、`@Around`等)来定义切面的通知(Advice)。`@EnableAspectJAutoProxy`注解使得Spring能够扫描到这些注解,并将它们作为AOP的一部分进行处理。 ##### 3. 代理的创建与织入 当Spring容器启动时,它会检查所有被`@Aspect`注解标记的bean,并根据这些bean中定义的切点和通知来创建代理对象。这些代理对象会在方法调用时,根据切点表达式判断是否需要对方法进行增强,并根据通知类型执行相应的逻辑。 #### 三、`@EnableAspectJAutoProxy`的配置选项 虽然`@EnableAspectJAutoProxy`注解本身并不直接提供过多的配置选项,但它背后的Spring AOP框架支持多种配置方式,以满足不同的需求: ##### 1. 代理模式的选择 虽然`@EnableAspectJAutoProxy`不直接控制代理模式,但你可以通过设置`spring.aop.proxy-target-class`属性(在Spring Boot项目中)或在配置类中显式设置`ProxyTargetClassAdvisorAutoProxyCreator`的`proxyTargetClass`属性来控制是否优先使用CGLIB代理。 ##### 2. 暴露代理对象 在某些情况下,你可能需要在同一个类中的方法之间调用时也能触发AOP增强。默认情况下,Spring AOP的代理是基于接口的,如果在同一个类内部的方法调用,不会通过代理对象,因此不会触发AOP增强。为了解决这个问题,Spring提供了`exposeProxy`属性(在`<aop:config>`标签或通过`@EnableAspectJAutoProxy`的`proxyTargetClass`属性间接影响,但非直接控制),但需要注意的是,这通常不是`@EnableAspectJAutoProxy`直接提供的配置,而是与Spring AOP的整体设计相关。 ##### 3. 自定义切面织入器的Bean 虽然不常见,但在某些高级场景中,你可能需要自定义切面织入器(Advisor Auto Proxy Creator)的Bean。这可以通过定义自己的Bean,并继承自`AbstractAdvisorAutoProxyCreator`类(或其子类)来实现,但这通常不是通过`@EnableAspectJAutoProxy`直接配置的。 #### 四、使用`@EnableAspectJAutoProxy`的实战 下面是一个简单的例子,展示如何在Spring Boot项目中使用`@EnableAspectJAutoProxy`来启用AspectJ自动代理,并实现一个简单的日志切面。 ```java // 启用AspectJ自动代理 @Configuration @EnableAspectJAutoProxy public class AppConfig { // 配置类内容 } // 定义一个切面 @Aspect @Component public class LoggingAspect { // 定义一个切点,匹配所有类的所有方法 @Pointcut("execution(* com.example.service.*.*(..))") public void serviceLayerExecution() {} // 在方法执行前后打印日志 @Before("serviceLayerExecution()") public void logBefore(JoinPoint joinPoint) { System.out.println("Before method: " + joinPoint.getSignature().getName()); } @After("serviceLayerExecution()") public void logAfter(JoinPoint joinPoint) { System.out.println("After method: " + joinPoint.getSignature().getName()); } } // 服务层的一个简单示例 @Service public class SomeService { public void performAction() { // 业务逻辑 System.out.println("Performing action..."); } } ``` 在上面的例子中,`AppConfig`类通过`@EnableAspectJAutoProxy`注解启用了AspectJ自动代理。`LoggingAspect`类被定义为一个切面,并通过`@Aspect`和`@Component`注解标记。它定义了一个切点`serviceLayerExecution`,该切点匹配`com.example.service`包下所有类的所有方法。然后,它定义了两个通知:`logBefore`和`logAfter`,分别在方法执行前后打印日志。最后,`SomeService`类中的`performAction`方法会因为符合切点条件而被自动增强,从而在调用前后打印出日志。 #### 五、总结 `@EnableAspectJAutoProxy`是Spring框架中用于启用AspectJ自动代理的关键注解,它使得开发者能够轻松地在Spring应用中实现AOP。通过配置`@EnableAspectJAutoProxy`,Spring容器能够自动识别并使用AspectJ注解的切面,并通过动态代理技术为需要被增强的bean创建代理对象,从而在不修改业务代码的情况下实现横切关注点的织入。了解`@EnableAspectJAutoProxy`的工作原理和配置选项,对于深入掌握Spring AOP至关重要。
上一篇:
AOP工具类 - AopUtils
下一篇:
AspectJ XML配置驱动实现 - <aop:aspectj-autoproxy/>
该分类下的相关小册推荐:
经典设计模式Java版
Mybatis合辑3-Mybatis动态SQL
Java语言基础9-常用API和常见算法
Java性能调优实战
Java语言基础4-数组详解
Java语言基础7-Java中的异常
Java语言基础11-Java中的泛型
Java语言基础10-Java中的集合
JAVA 函数式编程入门与实践
Java语言基础16-JDK8 新特性
Java面试指南
Java必知必会-JDBC