AOP拦截器

博客主要围绕CGlib展开,介绍了CGlib方法名在容器中的作用,保存组件代理对象及详细信息。阐述了有无拦截器时目标方法的执行情况,还说明了拦截器的获取流程,包括对增强器的处理和转换等内容。

LD is tigger forever,CG are not brothers forever, throw the pot and shine forever.
Modesty is not false, solid is not naive, treacherous but not deceitful, stay with good people, and stay away from poor people.
talk is cheap, show others the code and KPI, Keep progress,make a better result.
Survive during the day and develop at night。

目录

概 述

CGlib 方法名,相当于容器当中,通知方法的中的信息,保存组件的代理对象,
保存了详细信息,比如增强器,目标对象Step into 先进来,inter
需要执行的目标方法,目标拦截器连CGLIB 等bean 的对象。
如果没有拦截器懒,直接执行目标方法。
如果有拦截器,吧需要执行的目标对象,目标方法拦截器等信息传入创建一个CGlibMethodInvocaion 对象,process的方法。
并调用Object retVal=mi.processed();
拦截器获取流程,当前方法advissor 的拦截器量,怎么获取呢?
保存所有拦截器,config 增强器。通知方法的结果。
默认的ExposeInvalcation 和4个增强剂。便利每一个增强剂,会包装一个直接传进来,为增强剂的将其转为interface主要调用了
registert,interceptor ,刚才放过去了,methodInterception,适配器做个转换。将增将其转为List
如果是MethodInceptot,如果不是用一些增强器,转为intereptor.转为一个,打个断点,一个一个放行。如果是适配器,
MethodIneptor,after不是家下俩,看支不支持advisor的不是包装一个。
afterInterecpor.第四个,前置通知。整个转换每一个增强器,before adapter 拦截器转弯之后
方法的拦截器量,拦截器量。

小结

参考资料和推荐阅读

1.链接: link.

### AOP 拦截器的使用及实现原理 #### 一、AOP拦截器的概念 在面向切面编程(AOP, Aspect-Oriented Programming)中,拦截器是一种机制,用于在特定方法执行前后插入自定义逻辑。Spring框架中的AOP拦截器主要由`Advisor`和`MethodInterceptor`组成[^3]。 - **Advisor**: 定义了切点(Pointcut)和通知(Advice)。切点决定了哪些方法会被拦截,而通知则描述了拦截时的具体行为。 - **MethodInterceptor**: 是一种具体的 Advice 类型,它允许开发者在目标方法执行前或后加入额外的操作。 --- #### 二、AOP拦截器的工作流程 当一个方法被调用时,如果该方法匹配某个切点条件,则会触发拦截器链的执行。以下是具体工作流程: 1. 判断是否存在拦截器链。如果没有拦截器链,则直接执行目标对象的方法[^2]。 2. 如果存在拦截器链,则将这些拦截器封装为 `ReflectiveMethodInvocation` 对象,并通过其 `proceed()` 方法依次调用各个拦截器。 3. 在拦截器链中,每个拦截器可以决定是否继续向下传递请求或者中断整个调用链条。 4. 当所有拦截器都完成操作后,最终返回目标方法的执行结果。 --- #### 三、AOP拦截器的实现细节 ##### 1. JDK 动态代理与 CGLIB 的区别 Spring AOP 支持两种代理模式:JDK动态代理和CGLIB代理。两者的实现方式略有不同,但核心思想一致。 - **JDK动态代理**: - 需要目标类实现接口。 - 使用 `JdkDynamicAopProxy` 的 `invoke` 方法来拦截目标方法的调用。 ```java public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { ReflectiveMethodInvocation invocation = new JdkDynamicMethodInvocation(targetObject, targetClass, method, args); return invocation.proceed(); } ``` - **CGLIB代理**: - 不依赖于接口,适用于未实现任何接口的目标类。 - 使用 `DynamicAdvisedInterceptor` 的 `intercept` 方法来进行拦截。 ```java @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { ReflectiveMethodInvocation invocation = new CglibMethodInvocation(advised, targetSource.getTarget(), method, args); return invocation.proceed(); } ``` ##### 2. 拦截器链的核心组件——`ReflectiveMethodInvocation` `ReflectiveMethodInvocation` 是 Spring AOP 实现的关键类之一,负责管理拦截器链并控制方法调用的过程。它的 `proceed()` 方法实现了递归调用拦截器的功能。 ```java @Override public Object proceed() throws Throwable { if (this.currentInterceptorIndex == this.interceptorsAndDynamicMethodMatchers.size()) { // 执行实际的目标方法 return invokeJoinpoint(); } // 获取当前拦截器 Object interceptorOrInterceptionAdvice = this.interceptorsAndDynamicMethodMatchers.get(this.currentInterceptorIndex++); if (interceptorOrInterceptionAdvice instanceof InterceptorAndDynamicMethodMatcher) { // 处理动态切点... } else { // 调用下一个拦截器 return ((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this); } } ``` 上述代码展示了如何逐个调用拦截器链中的每一个拦截器,并最终到达目标方法的执行阶段。 --- #### 四、AOP拦截器的实际应用 以下是一个简单的 Kotlin 示例,展示如何配置和使用 AOP 拦截器。此示例也可以轻松转换为 Java 版本[^1]。 ```kotlin @Aspect class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") fun logBefore(joinPoint: JoinPoint) { println("Logging before method ${joinPoint.signature.name}") } @AfterReturning(pointcut = "execution(* com.example.service.*.*(..))", returning = "result") fun logAfterReturning(result: Any?) { println("Method returned with result $result") } } @Service class MyService { fun doSomething(): String { return "Hello from service" } } ``` 在这个例子中: - `@Before` 注解表示在指定方法执行之前记录日志。 - `@AfterReturning` 注解表示在方法成功返回之后记录返回值。 --- #### 五、总结 AOP拦截器是 Spring AOP 的重要组成部分,能够帮助开发者分离关注点,在不修改业务逻辑的情况下增强功能。其实现基于代理模式(JDK 或 CGLIB),并通过拦截器链的方式灵活地处理多个切面需求。理解其底层原理有助于更好地利用这一强大工具优化应用程序设计。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迅捷的软件产品制作专家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值