Spring AOP的概念与原理解析

AOP

AOP,面向切面编程,是IOC的一个拓展功能,是在IOC的基础上通过动态代理来实现的。动态代理生成的是bean对象的代理对象,也就是对bean的拓展,因此是在BeanPostProcessor的后置处理方法中实现的。

在OOP(面向对象编程)中,我们以类Class作为基本单元。在AOP中,我们以Aspect切面作为基本单元。切面,就是将那些与业务无关、却被多个业务模块共同调用的逻辑封装起来,比如日志功能。这样做可以减少系统内的重复代码,降低模块间的耦合度,并有利于后期的可操作性和可维护性。

1. AOP为什么要使用代理来实现?使用的是静态代理还是动态代理?

在Java使用代理,通常是为了在不修改原有类代码的基础上,对类实现扩展和增强,而这正是AOP所追求的功能。比如一个Human类,需要在它的每个方法被调用时在日志中记录调用时间。想要实现这个功能,我们当然可以直接修改Human类内部的方法,在每个方法内实现日志操作。但是很多时候最好不要动原始代码(遵循开放封闭原则OCP),这时候通过代理来实现对Human类的扩展与增强是最好的办法。

代理分为静态代理与动态代理两大类,我们知道Java的代理分为静态代理和动态代理。那么,AOP要用静态代理还是动态代理来实现呢?如果单论Human类,且内部方法少的话,直接用静态代理可能比较方便,只需要Human类与Human代理类实现同一个接口即可。但是AOP往往涉及一个包内的多个类、甚至多个包内的多个类,因此用动态代理在运行期间动态生成代理类会更加的方便。

Spring AOP是基于动态代理实现的,包括JDK动态代理和CGLIB动态代理。AOP是在bean生命周期中的BeanPostProcessor中实现的,从BeanPostProcessor接口内部的两个方法往下找,均可以找到AOP代理的最终两个实现类,如下图。

在这里插入图片描述

在Spring2.0以后,Spring也增加了对于AspectJ切点表达式的支持。

2. AOP的底层实现原理?

  1. 首先确定advice、切面、切点。
  2. 通过jdk或者cglib的方式来生成代理对象。
  3. 从DynamicAdvisedInterceptor中的intercept方法开始执行。
  4. 根据之前定义好的通知来生成拦截器链。
  5. 从拦截器连依次获取每一个通知开始执行。在执行过程中,为了方便找到下一个通知,会有一个CglibMethodInvocation对象。

3. jdk和cglib的动态代理有什么区别?

  • JDK动态代理:只提供接口的代理,不支持类的代理;通过反射接收被代理的类,且要求被代理的类必须实现一个接口,代理类需要实现java.lang.reflect.InvocationHandler接口,然后通过java.lang.reflect.Proxy.newProxyInstance()创建代理对象
  • CGLIB动态代理:如果目标类没有实现上面接口,Spring AOP会选择CGLIB来实现动态代理。CGLIB ( Code Generation Library ),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意, CGLIB 是通过继承的方式做的动态代理,因此如果某个类被标记为 final ,那么它是无法使用 CGLIB 做动态代理的;且类内被final修饰的方法无法使用CGLIB来进行增强。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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的基本概念和用法入手,了解其实现原理的同时,也可以通过调试和查看源码来加深理解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值