深度剖析Spring AOP源码,图文详解,小白也能看明白。

本文首先介绍了AOP的基本概念,包括连接点、切点、通知、织入等,并提供了一个简单的AOP示例。接着,详细阐述了SpringAOP的工作流程,分为前置处理、后置处理和执行切面三个阶段,特别是通过递归和责任链模式执行切面的方法。最后,通过对源码的解读,揭示了Spring如何创建和执行AOP代理对象的内部机制。
摘要由CSDN通过智能技术生成

一:概述以及目录

前两篇的源码解析,涉及到很多基础知识,但是源码的解读都不难,这篇⽂章刚好相反,依赖的基础知识不多,但 是源码⽐较难懂。 下⾯我会简单介绍⼀下 AOP 的基础知识,以及使⽤⽅法,然后直接对源码进⾏拆解。目录如下:

二:基础知识

2.1 什么是 AOP ?

AOP 的全称是 “Aspect Oriented Programming”,即⾯向切⾯编程。

在 AOP 的思想⾥⾯,周边功能(⽐如性能统计,⽇志,事务管理等)被定义为切⾯,核⼼功能和切⾯功能分别独 ⽴进⾏开发,然后把核⼼功能和切⾯功能“编织”在⼀起,这就叫 AOP。

AOP 能够将那些与业务⽆关,却为业务模块所共同调⽤的逻辑封装起来,便于减少系统的重复代码,降低模块间的 耦合度,并有利于未来的可拓展性和可维护性。

2.2 AOP 基础概念

  • 连接点(Join point):能够被拦截的地⽅,Spring AOP 是基于动态代理的,所以是⽅法拦截的,每个成员⽅ 法都可以称之为连接点;
  • 切点(Poincut):每个⽅法都可以称之为连接点,我们具体定位到某⼀个⽅法就成为切点; 增强/通知
  • (Advice):表示添加到切点的⼀段逻辑代码,并定位连接点的⽅位信息,简单来说就定义了是⼲什 么的,具体是在哪⼲;
  • 织⼊(Weaving):将增强/通知添加到⽬标类的具体连接点上的过程;
  • 引⼊/引介(Introduction):允许我们向现有的类添加新⽅法或属性,是⼀种特殊的增强;
  • 切⾯(Aspect):切⾯由切点和增强/通知组成,它既包括了横切逻辑的定义、也包括了连接点的定义。

上⾯的解释偏官⽅,下⾯⽤“⽅⾔”再给⼤家解释⼀遍。

切⼊点(Pointcut):在哪些类,哪些⽅法上切⼊(where); 通知(Advice):在⽅法执⾏的什么时机(when:⽅法前/⽅法后/⽅法前后)做什么(what:增强的功 能); 切⾯(Aspect):切⾯ = 切⼊点 + 通知,通俗点就是在什么时机,什么地⽅,做什么增强; 织⼊(Weaving):把切⾯加⼊到对象,并创建出代理对象的过程,这个由 Spring 来完成。

5 种通知的分类:

  • 前置通知(Before Advice):在⽬标⽅法被调⽤前调⽤通知功能;
  • 后置通知(After Advice):在⽬标⽅法被调⽤之后调⽤通知功能;
  • 返回通知(After-returning):在⽬标⽅法成功执⾏之后调⽤通知功能;
  • 异常通知(After-throwing):在⽬标⽅法抛出异常之后调⽤通知功能;
  • 环绕通知(Around):把整个⽬标⽅法包裹起来,在被调⽤前和调⽤之后分别调⽤通知功能。

2.3 AOP 简单示例

新建 Model 类:

@Data
@Service
public class Model {
    public void everyDay() {
        System.out.println("睡觉");
    }
}
复制代码

添加 ModelAspect 切⾯:

@Aspect
@Component
public class ModelAspect {
    @Pointcut("execution(* com.java.Model.everyDay())")
    private void myPointCut() {
    }
    // 前置通知
    @Before("myPointCut()")
    public void myBefore() {
        System.out.println("吃饭");
    }
    // 后置通知
    @AfterReturning(value = "myPointCut()")
    public void myAfterReturning() {
        System.out.println("打⾖⾖。。。");
    }

}
复制代码

applicationContext.xml 添加:

<!--启⽤@Autowired等注解-->
<context:annotation-config/>
<context:component-scan base-package="com" />
<aop:aspectj-autoproxy proxy-target-class="true"/>
复制代码

程序⼊⼝:

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context =new
                ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        M
Spring AOPSpring框架中的一个重要模块,它提供了一种面向切面编程的方式,可以让开发者将一些通用的、横切的关注点(如事务、安全、缓存等)从业务逻辑中剥离出来,使得业务逻辑更加清晰简洁,代码复用更加方便。 Spring AOP的实现原理主要基于Java动态代理和CGLIB动态代理两种方式,其中Java动态代理主要用于接口代理,而CGLIB动态代理则主要用于类代理。Spring AOP中的核心概念是切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)和织入(Weaving)。 在Spring AOP中,切面是一个横向的关注点,它跨越多个对象和方法,通常包含一些通用的功能,如日志记录、安全控制等。连接点则是程序中可以被切面拦截的特定点,如方法调用、异常抛出等。通知是切面在连接点执行前后所执行的动作,包括前置通知(Before)、后置通知(After)、异常通知(AfterThrowing)、返回通知(AfterReturning)和环绕通知(Around)。切点则是用来匹配连接点的规则,它可以指定哪些连接点会被切面拦截。织入则是将切面应用到目标对象中的过程,它可以在编译时、类加载时、运行时等不同的阶段进行。 Spring AOP源码解析涉及到很多细节,包括代理的生成、通知的执行、切点的匹配等,需要深入了解Spring框架的内部实现和Java的反射机制。对于初学者而言,可以先从Spring AOP的基本概念和用法入手,了解其实现原理的同时,也可以通过调试和查看源码来加深理解。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值