Spring源码解析之AOP篇(二)----AOP名词术语解释

Spring AOP:Aspect-oriented Programming,即面向切面编程。在切面编程中,引入了一些新的概念,这在学习AOP之前,必须得弄清楚,且得明白它们之前的关联关系,否则在后面的源码学习中会比较绕。毕竟,弄清楚了他们各自的功能,我们就能很容易的带着问题逐个击破,接下来我逐个讲解。

Aspect

翻译过来,叫做切面。首先看一下Spring广官方是如何给出解释的。切面是跨越多个类的关注的模块化。事务管理是企业Java应用程序中横切关注点的一个很好的例子。在Spring AOP中,切面是通过使用常规类(基于模式的方法)或使用@Aspect注释的常规类(@AspectJ样式)来实现的。

通俗点来说,我们在项目中使用到的事务管理,例如我在add方法中需要新增一条用户,可是我自己并不想来进行实物的开启,关闭,或者说是异常时的回滚操作。那么我可以定义一个切面,对这个方法进行拦截,只要是涉及到add的方法,你的事务控制交给我来管了,你只要负责你的新增操作即可。而DAO层算是一个大的模块了吧。我们可以通过带有@Aspect注解的常规类来实现对某一个模块进行切面编程。

@Aspect
public class LogAspect {
    //具体需要对该模块进行怎样的增强
}

我们知道了如何定义一个切面来拦截某一个模块。那我们怎么才能让这个切面知道,我要拦截的是项目的DAO层呢?接下来我们来看下Spring是如何来指定这个模块的。

Pointcut

翻译过来,叫做切入点,首先看下Spring官网是如何给出解释的。切入点:匹配连接点的谓词。通知与切入点表达式相关联,并在与切入点匹配的任何连接点上运行(例如,执行具有特定名称的方法)。连接点由切入点表达式匹配的概念是AOP的核心,Spring默认使用AspectJ切入点表达式语言。

通俗的说,Pointcut就是用来设定切面切入的范围,Spring中说到了切点表达式,我们可以通过配置表达式来指定切入范围。例如@Pointcut("execution( * com.xxx.xxx.add(..))")。那么Spring就会为com.xxx.xxx包下,所有的add方法进行增强。

@Aspect
public class LogAspect {
    //指定具体的切点表达式
    public static final String POINT_CUT = "execution(* com.xxx.xxx.add(..))";
        
}

这里已经讲明白了切入点的概念,那么增强的功能在何时才能生效呢?很明显,只有在我们具体的使用场景才会生效。而我们在上一篇文章中详细的介绍了代理模式的三种实现方式。要想在不改变原功能的前提下,完成对原功能的功能增强。需要对目标对象进行代理。所以此时在实际调用的过程中实则是代理对象invoke的调用逻辑,或者cglib中的intercept的调用逻辑。而这每一个实际的调用过程被称之为连接点。

Join point

翻译过来,叫做连接点,先看下Spring官方是如何做出解释的。连接点:程序执行过程中的一个点,如方法的执行或异常的处理。在Spring AOP中,连接点总是表示方法执行。

public interface UserService {
    void save(User user);
    void update(User user);
}

public class LoginServiceImpl {
    @Autowired
    private UserService userService;
    
    public void login(){
        ?/此处涉及到方法的调用
        userService.save();
    }
}

不难看出,假设当前被注入的userService对象是在切点拦截范围内,那么此时注入的肯定为代理对象。当调用到save方法时,肯定会被增强,这就是一个连接点。即每一个具体的方法执行。

Advice

翻译过来,叫做通知,也可算是一个拦截器。先看下Spring官方是如何做出解释的。通知:切面在特定连接点上采取的操作。不同类型的通知包括“before”、“after”、“around”等通知。将通知建模为拦截器,并维护围绕连接点的拦截器链。

@Aspect
public class LogAspect {
    //指定具体的切点表达式
    public static final String POINT_CUT = "execution(* com.xxx.xxx.add(..))";
    
    @Before(POINT_CUT)
    public void before(){
        System.out.println("-----------------开启事务");
    }
    @After(POINT_CUT)
    public void after() {
        System.out.println("-----------------关闭事务");
    }
    @AfterThrowing(POINT_CUT)
    public void throwing() {
        System.out.println("-----------------事务回滚");
    }
}

此处仍然以事务管理为例,比如调用add方法时,会首先开启事务调用before方法,然后再执行add方法本身的逻辑。如果执行成功,最后会关闭事务调用after方法,如果执行失败,则调用throwing方法进行事务回滚。这整个执行过程被称之为拦截器链,最后会按照此顺序依次执行。

AOP Proxy

Aop Proxy分为两类:JDK动态代理和Cglib动态代理。由此对象来执行整个方法的拦截器链。在Spring中,默认是使用JDK动态代理的,因为我们的Service层是主要的业务实现层,是主要涉及需要增强的地方。而service层都是基于接口而来。而cglib是通过动态创建子类代理对象来实现增强。如果你想使用cglib代理,那么你需要在<aop:aspectj-autoproxy>标签中配置proxy-target-class=true。

Weaving

官方术语叫织入,何为织入。通俗来说,围绕how,when,where展开,在什么地方什么时候需要做什么。织入就是通过代理对象在切面涉及的范围内动态的讲拦截器织入到目标方法中。何为动态,你可以理解为运行时,即方法执行时。

AOP各术语的关联关系

有了以上术语的基础,相信会对Spring的工作流程的理解有很大的帮助,下面我大致画了下流程图,帮助大家更好的理解。

应该算是涵盖了上面所有的术语,这个流程图可以看出他们是如何分工协作的。今天的内容就介绍到这了,下一篇文章我会正式开始进入源码分析阶段,看看在Spring中,是如何开启AOP的。感兴趣的可以持续关注我的AOP系列博文,谢谢大家!

<think>首先,用户的问题是:“我想理解Spring AOP中的相关术语 请问Spring AOP 常用术语 解释”,意思是“我想理解Spring AOP中的相关术语,请问Spring AOP常用术语解释”。 根据系统级指令: - 所有行内数学表达式必须使用$...$格式。但在这个问题中,没有数学表达式,所以可能不需要。 - 独立公式必须使用$$...$$格式并单独成段。同样,这里可能不适用。 - LaTeX语法正确。确保任何数学表达正确。 - 使用中文回答。整个回答要用中文。 - 生成相关问题。在回答末尾,添加相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。参考提供的引用,我需要引用这些来源。 提供的引用有: - 引用[1]: 关于Spring AOP术语- 引用[2]: 关于Spring AOP相关术语解释及简单使用。 - 引用[3]: 关于SpringAOP中名词解释。 用户说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 用户上一次的问题是这个,所以没有历史。我应该基于这些引用构建回答。 用户可见层指令:回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠。 所以,我需要解释Spring AOP的常用术语,基于提供的引用。 从引用中提取关键术语- 从引用[1]: 切面、通知、切入点、连接点、引介、目标对象、代理对象、织入、通知方法、切点表达式、切面优先级、织入器、AOP代理、AOP框架。 - 从引用[2]: 通知(Advice)- 从引用[3]: 连接点(JoinPoint)、切入点(Pointcut)、通知(Advice)、目标对象(Target Object)、织入(Weaving)、代理(Proxy)、切面(Aspect)。 常见术语包括:切面、通知、切入点、连接点、目标对象、代理、织入等。 我应该覆盖核心术语。 结构化回答: 1. **介绍**:简要介绍Spring AOP术语的重要性。 2. **解释每个术语**:逐个解释常用术语。 3. **总结**:强调AOP的好处。 4. **生成相关问题**:在最后添加相关问题。 使用引用:在解释每个术语时,如果基于引用,自然地添加引用标识,如[^1]。 例如,解释连接点时,可以引用[^3]。 最终,添加相关问题。 相关问题应该与主题相关,比如: - 如何定义一个切入点? - Spring AOP中的通知类型有哪些? - 织入的过程是怎样的? 确保回答清晰、逐步。 现在,写出回答。</think>### Spring AOP 常用术语解释 Spring AOPAspect-Oriented Programming,面向切面编程)是一种编程范式,用于将横切关注点(如日志、事务管理)与核心业务逻辑分离,从而提高代码的模块化、可维护性和可重用性。理解其核心术语是掌握 Spring AOP 的基础。以下我将基于权威资料,逐步解释 Spring AOP 的常用术语,确保解释清晰可靠。每个术语解释都参考了相关文献,并在末尾添加了引用标识。 #### 1. **连接点(Join Point)** 连接点是程序执行过程中的一个特定点,例如方法调用、字段访问或异常抛出。在 Spring AOP 中,连接点通常指方法的调用(如 `UserService.save()` 方法)。它表示 AOP 可以插入增强逻辑的位置。连接点是动态的,由 AOP 框架在运行时识别[^3]。 #### 2. **切入点(Pointcut)** 切入点是一组连接点的集合,通过表达式定义哪些连接点需要被增强。例如,表达式 `execution(* com.example.service.*.*(..))` 表示所有 `com.example.service` 包下的方法调用。切入点用于精确控制 AOP 的作用范围,避免不必要的增强[^3]。 #### 3. **通知(Advice)** 通知是在切入点指定的连接点上执行的具体动作。它定义了“何时”和“做什么”。通知分为多种类型: - **前置通知(Before)**:在方法执行前执行(如权限检查)。 - **后置通知(After)**:在方法执行后执行,无论是否成功(如资源清理)。 - **返回通知(After-returning)**:方法成功返回后执行(如日志记录)。 - **异常通知(After-throwing)**:方法抛出异常时执行(如错误处理)。 - **环绕通知(Around)**:包裹方法执行,可以控制方法执行前后和过程(如事务管理)。 通知是 AOP 的核心行为单元,通过组合实现横切关注点[^1][^2]。 #### 4. **切面(Aspect)** 切面是通知和切入点的组合,封装了横切关注点的完整逻辑。例如,一个日志切面可能包含“所有Service类方法调用”的切入点和“记录方法参数”的通知。切面在代码中作为独立模块定义,提高了代码的模块化程度[^1][^3]。 #### 5. **目标对象(Target Object)** 目标对象是被代理的原始对象,包含业务逻辑的核心方法。例如,一个 `UserServiceImpl` 类实例。AOP 增强逻辑不会直接修改目标对象,而是通过代理机制间接操作[^3]。 #### 6. **代理(Proxy)** 代理是 AOP 框架创建的对象,用于包装目标对象。当调用目标对象的方法时,代理会触发通知逻辑。Spring AOP 使用 JDK 动态代理(针对接口)或 CGLIB 代理(针对类)实现代理机制。代理对象在运行时动态生成,对调用者透明[^1][^3]。 #### 7. **织入(Weaving)** 织入是将切面应用到目标对象的过程,即将通知逻辑“编织”到连接点。在 Spring AOP 中,织入通常在运行时完成(动态代理),但也支持编译时或类加载时织入。织入是 AOP 实现的关键步骤,确保增强逻辑无缝集成[^1][^3]。 #### 8. **引介(Introduction)** 引介是一种特殊的通知,用于为目标对象动态添加新接口或方法。例如,为一个现有类添加 `Auditable` 接口及其方法。引介扩展了对象的功能,而无需修改源代码,适用于横切关注点的全局增强[^1]。 #### 9. **切点表达式(Pointcut Expression)** 切点表达式是用于定义切入点的字符串,基于 AspectJ 语法。例如,`@annotation(org.springframework.transaction.annotation.Transactional)` 表示所有带 `@Transactional` 注解的方法。表达式支持通配符和逻辑运算符,实现灵活的匹配规则[^1]。 #### 总结 Spring AOP术语体系(如连接点、切入点、通知、切面)构成了其核心架构,通过代理和织入机制实现非侵入式增强。合理使用 AOP 可以减少重复代码、降低耦合度,提升开发效率和系统可维护性[^1][^2][^3]。如果您有具体场景(如日志或事务),可以进一步探讨实现细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值