简单讲讲一点切面东西
前面我在说Spring bean生命周期相关时,特意在结尾举例时引用了MethodInterceptor。其实真实开发场景使用并不多,大多情况下拦截并增强代码通过@Aspect就够了。但是总有一些小情况,比如极致追求效率(其实差不太多),轻量级进行部分定制,或者万一是做成一个工具类,跨应用模块工具的话或许都不是Spring 框架了,更别说Spring AOP.此时就可以使用CGLIB的MethodInterceptor。
Spring AOP 的 MethodInterceptor
-
集成性:Spring AOP 是 Spring 框架的一部分,设计上与 Spring 的其他模块更好地集成,特别是与 Spring 容器和事务管理的紧密结合。
-
接口与实现:Spring AOP 使用
org.aopalliance.intercept.MethodInterceptor接口,其invoke方法允许开发者在方法调用前后进行逻辑处理。 -
代理类型选择:Spring AOP 可以选择使用 JDK 动态代理或 CGLIB 动态代理。如果目标类有接口,默认使用 JDK 动态代理,否则使用 CGLIB。
-
AOP 声明方式:Spring 提供了多种方式声明 AOP,包括 XML 配置、注解(如
@Aspect)和基于代理的编程模型。Spring AOP 更偏向于通过声明性编程来实现横切关注点(cross-cutting concerns),如事务管理、日志记录、身份验证等。 -
切面(Aspect)编程:Spring AOP 允许定义切面,切面包含增强代码(Advice)和切点(Pointcut)。
CGLIB 的 MethodInterceptor
-
直接使用 CGLIB:CGLIB 是单独的动态代理库,Spring 使用它来为没有实现接口的类创建代理。CGLIB 直接工作在字节码级别,通常用于创建代理类的子类来进行方法拦截。
-
拦截方法:CGLIB 使用
org.springframework.cglib.proxy.MethodInterceptor接口,其intercept方法允许在方法调用前后插入逻辑。 -
直接代理机制:直接使用 CGLIB 时,通常使用
Enhancer类来生成代理,而不是通过ProxyFactoryBean或其他 Spring 提供的抽象层。 -
灵活但独立:CGLIB 提供了灵活的代理机制,但自己处理代理时缺乏与 Spring 的直接集成,仍然可以实现 AOP 的功能,但需要开发者自己实现代理逻辑和管理。
讲点己见
想了想,我还是觉得切面更多在于想法上,就是能想到用这样的方式去处理。我个人觉得,这种理念是与业务解耦,抽象出去后以便关注更多全局或通用层面的东西(或者说横切关注点)。其内部是拦截原方法的执行,提前做点啥,或者之后做点啥,或者之前之后都做点啥等等。这种思维,我感觉很多地方都有吧,你看网关,过滤器,他们不也是提前做点啥么,只不过不是切面呗,但他们本身就是整个系统进入口等全局层面的,与业务本身挂钩就不太大。再看拦截器,拦截请求进入控制器,也有进入前的前置操作,也有进入后但是模型和视图加载回显之前的操作,也有视图返回后的操作等。 AOP呢还有个代理,默认JDK代理,类没有实现接口时就是CGLIB,当然可直接开启CGLIB。那代理在这里的加入也是避免侵入原有的业务代码,用代理对象来代替执行和判断等切面内的行为。
我前面从一个方法拦截上引入这个话题,其实就是简单来说说我们通过注解做到的切面,其实也是对应有接口的。(大多数情况下还是用注解方式)
简述
了解下advice,advisor,advised
-
advice:“通知”,表示 Aspect 在特定的 Join point 采取的操作。包括 “around”, “before” 和 “after 等 Advice,大体上分为了三类:MethodInterceptor、BeforeAdvice、AfterAdvice。这便是对应的接口(当然了还有异常情况的通知,返回才通知等细化的方式)。当你在Aspect切面里使用@Around时,其实相当于你自定义一个类来实现MethodInterceptor接口,然后重写invoke方法(如果是CGLIB的MethodInterceptor则是重写intercept方法)
-
advisor:你可以把他理解为将advice和pointCut结合联系起来的。可以包含一个 Advice 和一个 Pointcut,用于将特定的 Advice 应用于匹配的 Joinpoint。它是 Spring AOP 的一个基础接口。它的子接口 PointcutAdvisor 是一个功能完善接口,它涵盖了绝大部分的 Advisor。aop提供了一些现成的实现,比如DefaultPointcutAdvisor
-
advised:AOP 代理工厂配置类接口。提供了操作和管理 Advice 和 Advisor 的能力。它的实现类 ProxyFactory 是 Spring AOP 主要用于创建 AOP 代理类的核心类
-
Weaving:将 Aspect 应用到目标对象(即将 Advice 绑定到目标对象上的 Joinpoint)的过程。Weaving 可以在编译、类加载或运行时进行。在 Spring AOP 中,通常在运行时进行,也就是通过动态代理来织入。

浙公网安备 33010602011771号