本篇文章主要用来记录研究aop源码的过程。
aop 基本概念
- 方面(Aspect):跨越多个类的模块化关注点。事务管理是企业Java应用程序中横切关注点的一个很好的例子。在SpringAOP中,方面是通过使用常规类(基于xml的方法)或使用@Aspect注解(@Aspectj样式)注解的常规类来实现的。
- 连接点(Join point):程序执行过程中的一点,如方法的执行或异常的处理。在SpringAOP中,连接点总是表示一个方法执行。
- 通知(Advice):一个方面在特定连接点采取的行动。不同类型的通知包括“环绕”、“前“和”后”通知。(稍后将讨论通知类型。)许多AOP框架(包括Spring)将通知建模为拦截器,并在连接点周围维护拦截器链。
- 切点(Pointcut):与连接点匹配的谓词。通知与切入点表达式关联,并在与切入点匹配的任何连接点上运行(例如,使用特定名称执行方法)。pointcut表达式匹配的连接点概念是AOP的核心,Spring默认使用AspectJ pointcut表达式语言。
- 引入(Introduction):代表类型声明其他方法或字段。SpringAOP允许你向任何advised对象引入新的接口(和相应的实现)。例如,你可以使用一个Introduction使bean实现一个IsModified接口,以简化缓存。(introduction在AspectJ社区中称为类型间声明。)
- 目标对象(Target object):由一个或多个方面advised的对象。也称为“advised 对象”。因为SpringAOP是通过使用运行时代理实现的,所以这个对象始终是一个代理对象。
- AOP代理:由AOP框架创建的用于实现aspect contracts(通知方法执行等)的对象。在Spring框架中,AOP代理是JDK动态代理或CGLIB代理。
- 编织(Weaving):将aspects与其他应用程序类型或对象链接,以创建advised的对象。这可以在编译时(例如,使用AspectJ编译器)、加载时或运行时完成。Spring AOP和其他纯Java AOP框架一样,在运行时进行编织。
Spring AOP包含以下几种通知类型:
- Before advice:在连接点之前运行但不能阻止执行到连接点的通知(除非它抛出异常)。
- After returning advice:在连接点正常完成后要运行的通知(例如,如果方法返回并且不引发异常)。
- After throwing advice: 如果方法通过引发异常而退出,则要执行的通知。
- After (finally) advice:无论连接点退出的方式如何(正常或异常返回),都要执行的通知。
- Around advice:环绕连接点(如方法调用)的通知。这是最有力的通知。around通知可以在方法调用前后执行自定义行为。它还负责通过返回自己的返回值或引发异常来选择是继续到连接点还是快捷地执行通知的方法。
