AOP

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

广义理解

面向切面编程【Aspect-Orienred Programming】 ,AOP可以说是对OOP的补充和完善,OOP引入封装继承和多态建立一种对象层次结构,用以模拟公共行为的一个集合。实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建"方面",从而使得编译器可以在编译期间织入有关"方面"的代码,属于静态代理

AOP的常用功能

  1. 权限控制
  2. 缓存控制
  3. 事务控制
  4. 审计日志
  5. 性能监控
  6. 分布式追踪
  7. 异常处理

AOP的相关概念

  1. Join point(连接点):程序执行期间的某一个点,例如执行方法或处理异常时候的点。在 Spring AOP 中,连接点总是表示方法的执行

  2. Advice(通知):通知是指一个切面在特定的连接点要做的事情。通知分为方法执行前通知,方法执行后通知,环绕通知等。许多 AOP 框架(包括 Spring)都将通知建模为拦截器,在连接点周围维护一系列拦截器(形成拦截器链),对连接点的方法进行增强。

  3. Pointcut(切点):一个匹配连接点(Join point)的谓词表达式。通知(Advice)与切点表达式关联,并在切点匹配的任何连接点(Join point)(例如,执行具有特定名称的方法)上运行。切点是匹配连接点(Join point)的表达式的概念,是AOP的核心,并且 Spring 默认使用 AspectJ 作为切入点表达式语言。

    1. wildCards通配符

      1. *匹配任意数量的字符
      2. +匹配指定的类以及子类
      3. … 表达了匹配任意数的子包或者参数
    2. Operators

      1. &&
      2. ||
    3. designators指示器

      1. 匹配方法

        1. execution

          // ? 表示可以省略
          execution(
              modifier-pattern?  修饰符匹配
              ret-type-pattern   返回值匹配
              declaring-type-pattern?  类路径匹配
              name-pattern(param-pattern)  方法名匹配
              throws-pattern? 异常类型匹配
          )
          
      2. 匹配注解

        1. @target

          // 匹配标注有AdminOnly的类底下的方法,要求的annotation的RetentionPolicy级别为Runtime
          @PointCut"@target(com.imooc.demo.security.AdminOnly)")
          public void annoDemo(){}
          
        2. args

          // 匹配传入的参数类型标注有AdminOnly注解的方法
          @PointCut"@args(com.imooc.demo.security.AdminOnly)")
          public void annoDemo(){}
          
        3. within

          // 匹配标注有Beta的类底下的方法,要求的annotation的RetentionPolicy级别为CLASS
          @PointCut"@within(com.google.common.annotaions.Beta)")
          public void annoWithDemo(){}
          
        4. annotation

          // 匹配方法标注有AdminOnly的注解的方法,要求的annotation的RetentionPolicy级别为METHOD
          @PointCut"@annotation(com.imooc.demo.security.AdminOnly)")
          public void annoDemo(){}
          
      3. 匹配包/类型

        1. within

          // 匹配ss类里的所有的方法
          @pointCut(“within(com.imooc.service.ss)
          public void matchType(){}
          
          // 匹配ss包以及子包下所有类的方法
          @pointCut(“within(com.imooc..*)
          public void matchPackType(){}
          
      4. 匹配对象

        1. this

          // 匹配aop对象的目标对象为指定类型的方法,即DemoDao的aop代理对象的方法
          @PointCut(“this(com.immoc.DemoDao)")
          public void thisDemo(){}
          
        2. bean

          // 匹配所有以Service结尾的bean里的方法
          @PointCut(“bean(*Service)")
          public void beanDemo(){}
          
        3. target

          // 匹配实现IDao接口的目标对象(而不是aop代理后的对象)的方法,这里即DemoDao的方法
          @PointCut(“target(com.immoc.IDao)")
          public void targetDemo(){}
          
      5. 匹配参数

        args

  4. Aspect(切面):它是一个跨越多个类的模块化的关注点,它是通知(Advice)和切点(Pointcut)合起来的抽象,它定义了一个切点(Pointcut)用来匹配连接点(Join point),也就是需要对需要拦截的那些方法进行定义;它定义了一系列的通知(Advice)用来对拦截到的方法进行增强;

  5. Target object(目标对象):被一个或者多个切面(Aspect)通知的对象,也就是需要被 AOP 进行拦截对方法进行增强(使用通知)的对象,也称为被通知的对象。由于在 AOP 里面使用运行时代理,所以目标对象一直是被代理的对象。

  6. AOP proxy(AOP 代理):为了实现切面(Aspect)功能使用 AOP 框架创建一个对象,在 Spring 框架里面一个 AOP 代理要么指 JDK 动态代理,要么指 CgLIB 代理。

  7. Weaving(织入):是将切面应用到目标对象的过程,这个过程可以是在编译时(例如使用 AspectJ 编译器),类加载时,运行时完成。Spring AOP 和其它纯 Java AOP 框架一样,是在运行时执行植入。

  8. Advisor:这个概念是从 Spring 1.2的 AOP 支持中提出的,一个 Advisor 相当于一个小型的切面,不同的是它只有一个通知(Advice),Advisor 在事务管理里面会经常遇到,

Adivice

  • @Before前置通知
  • @After后置通知
  • @AfterThrowing异常通知
  • @AfterReturning返回通知
  • @Around环绕通知

三种织入方式

  • 编译时织入

    在代码编译时,把切面代码融合进来,生成完整功能的java字节码,需要特殊的编译器如AspectJ

  • 类加载的时候织入

    在java字节码加载的时候,把切面的字节码融合进来,同样需要特殊的编译器如AspectJ和AspectWerkz

  • 运行时织入

    运行时,通过动态代理的方式调用切面代码,增强业务功能,spring采用这种方式,动态代理有性能开销,但好处明显,不需要特殊编译器和类加载器

两种方式生成代理对象

具体使用那种生成由AopProxyFactory根据AdvisedSupport对象的配置来决定

默认策略是如果目标类是接口,则使用JDKProxy,否则使用cglib

  • jdkProxy

    使用反射来接收被代理的类,通过Proxy类动态生成代理类,并且要求类实现接口InvocationHandler

    只能针对有接口的类的接口方法进行动态代理

    不能对private进行代理

  • Cglib

    以继承的方式,通过修改字节码生成目标的动态代理

    某个类被标记为final或者static,无法使用cglib

    无法对private,static方法进行代理

    借助ASM实现,ASM是一个能够操作字节码的框架

  • 对比

    反射机制在生层类的过程中比较高效

    ASM在生成类之后的执行过程中比较高效

spring中如何选择哪种代理方式

  • 如果目标对象实现了接口,默认使用JDK动态代理

  • 如果目标对象没有实现接口,使用Cglib进行动态代理

  • 如果目标对象实现了接口,且强制cglib代理。则使用cglib代理

    // 强制使用Cglib代理
    @EnableAspectJAutoProxy(proxyTargetClass = true)
    

多个AOP的链式调用

在这里插入图片描述

代理模式

接口 + 真实实现类 + 代理类

spring中代理模式的实现

真正实现类的逻辑包含在了getBean方法中

getBean方法返回的实际上是Proxy的实例

Proxy是Spring采用JDKProxy或者Cglib动态生成的

AOP的问题

无法实现内部调用

@Component
public class MenuService {
    @Cache(cacheName = {"menu"})
    public List<String> getMenuList() {
        return "";
    }
    // 走了内部调用,缓存注解会不生效,因为相当于调用的this.getMenuList(),但是this并不是代理的Bean
    public List<String> getMenuList2(){
        return getMenuList();
    }
}

AOP和拦截器以及过滤器的区别

Filter过滤器:

​ 拦截web访问url地址。

​ 过滤器是在面向切面编程中应用的,就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法。是基于JAVA的反射机制。过滤器不是在web.xml,比如struts在struts.xml中配置,

Interceptor拦截器:

​ 拦截以 .action结尾的url,拦截Action的访问。

​ Servlet中的过滤器Filter是实现了统一设置编码,简化操作;同时还可进行逻辑判断,如用户是否已经登陆、有没有权限访问该页面等等工作。它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁

Spring AOP拦截器:

​ 只能拦截Spring管理Bean的访问(业务层Service)

Spring AOP,是AOP的一种实现,使用的是代理模式。

Filter(过滤器)是J2EE的规范,Servlet2.3开始引入/实现的是职责链模式。Filter可以用来设置字符集、控制权限、控制转向等等。Filter也是AOP的一种实现。

Interceptor (拦截器),是Struct2中的概念。同样是AOP的一种实现。

Filter与Interceptor联系与区别

  1. 拦截器是基于java的反射机制,使用代理模式,而过滤器是基于函数回调。

  2. 拦截器不依赖servlet容器,过滤器依赖于servlet容器。

  3. 拦截器只能对action起作用,而过滤器可以对几乎所有的请求起作用(可以保护资源)。

  4. 拦截器可以访问action上下文,堆栈里面的对象,而过滤器不可以。

  5. 执行顺序:过滤前-拦截钱-Action处理-拦截后-过滤后。

示波器面板上的隐藏功能:如何利用BW Limit和EXT TRIG提升测量精度 本文深入探讨示波器面板上的隐藏功能BW Limit和EXT TRIG,揭示它们如何提升测量精度。通过带宽限制(BW Limit)有效滤除高频噪声,结合外部触发(EXT TRIG)确保稳定信号捕获,为电子测量提供专业解决方案。特别适用于开关电源、传感器信号等复杂场景的高精度测量需求。 阅读详情

相关推荐

MATLAB图像去噪实战:如何用巴特沃斯滤波器完美去除横条纹(附完整代码)

本文详细介绍了如何使用MATLAB中的巴特沃斯滤波器有效去除图像中的横条纹噪声。通过频域分析和滤波处理,结合完整的代码示例,帮助读者掌握从噪声分析到参数优化的全流程技术,实现高质量的图像去噪效果。

weixin_30566063的博客 542

HashMap

tableSizeFor() 计算最小的大于等于这个容量的值【2的幂】 static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16

User_kh的博客 224

某头部能源集团“数据治理”到“数智应用”跃迁案例剖析

本次案例能源企业实现了从“数据可用”到“指标驱动”再到“智能决策”的全链条升级,标志着集团在数字化、智能化治理能力上的系统跃升,构建起面向未来的数智管理新范式。

a958014226的博客 1230

Spring AOP

AOP(Aspect-Oriented Programming,面向切面编程):是一种软件开发的编程范式,旨在将横切关注点(cross-cutting concerns)与核心业务逻辑分离,以提高代码的模块化性、可维护性和复用性

2301_76161469的博客 5262

什么是AOPAOP的作用是什么?常见AOP功能

AOP全称(Aspect Oriented Programming)面向切片编程的简称 AOP的定义: AOP通过预编译方式和运行期动态代理实现,在不修改源代码的情况下,给程序动态统一添加功能的一种技术,简称AOP。是spring框架的一个重要内容,是OOP(面向对象编程)的衍生模范型。 AOP的作用: 利用AOP对业务逻辑的各个部分进行隔离,降低业务逻辑的耦合性,提高程序的可重用型...

诗水人间 15万+

什么是 AOP,谈谈对 AOP 的理解,在 SpringAOP 是怎么实现的

AOP 是一个有用的工具,适合处理项目中那些“重复、统一、通用”的逻辑。用它可以让业务代码更清晰,横切逻辑更集中。关键是搞清楚它的原理,知道适合做什么,避免滥用。理解代理机制、通知流程和 Spring 的执行细节,是用好 AOP 的基础。选对场景、合理使用,AOP 能提升项目质量和开发效率。不是所有问题都靠 AOP 解决,合适的时候上,才是它真正的价值。

2401_88055648的博客 1731

SpringAOP

AOP(Aspect Oriented Programming) 是一种编程范型,即面向切面编程。什么是面向切面编程?切面就是指某一类特定问题,所以AOP也可以理解为面向特定方法编程。面向编程旨在通过分离横切关注点来提高代码的模块化和可维护性,允许开发者将那些与业务逻辑无关,但又需要在多个地方使用的功能(如日志记录、事务管理、安全性等)从业务逻辑中分离出来。在前面我们的登录校验,用了拦截器,其实也是对AOP思想的一种实现。统一数据返回格式和统一异常处理也是AOP的一种实现。

zhyhgx的博客 1885

什么是AOPAOP能干什么,有什么优点

什么是AOP 全称是 Aspect Oriented Programming 即:面向切面编程。是OOP的延续,也是Spring框架中的一个重要内容,是函数式编程的一种衍生泛型。简单的说他就是把我们程序重复的代码抽取出来,在需要执行的时候使用动态代理技术在不修改源码的基础上,对我们的已有方法进行增强。 AOP能干什么 举个例子,你想给你的网站记录用户访问日志: 对某些url,是不用记录的,而有些是需要记录的 如果你依然使用OOP,面向对象, 那你只能在那些url对应的Controller代码里面,一个一个写

怪咖@的博客 2万+

什么是 AOPAOP 的作用是什么?

面向切面编程是一种强大的编程范式,通过将横切关注点从主要业务逻辑中抽离出来,提高了代码的模块化、可维护性和可扩展性。AOP的实现方式多种多样,开发人员可以根据具体需求选择合适的方式。使用AOP时需要注意合理划分切面,避免过度使用AOP导致系统难以理解和调试。同时,对于不同的横切逻辑,可以考虑使用不同的通知类型,以便更好地组织和管理代码。总体而言,AOP是现代软件开发中的一项重要技术,它为开发人员提供了一种新的思路和工具,帮助我们更好地构建可维护、可扩展的软件系统。

Itmastergo的博客 3593

AOP】什么是AOPAOP有哪些应用?

AOP(面向切面编程,Aspect-Oriented Programming)是一个编程范式,用于将横切关注点(cross-cutting concerns)与业务逻辑分离。在 Java 中,AOP 的主要目标是通过预先定义的切面(aspect)来增强(或修改)目标对象的功能,而不修改目标对象的源代码。

slj18633752884的博客 1929

java AOP

在当今复杂的 Java 企业级应用开发场景中,软件系统的规模不断扩大,功能日益繁多。业务逻辑之间的交织和耦合问题愈发突出,使得代码的维护、扩展以及测试变得异常困难。传统的面向对象编程(OOP)虽然在封装、继承和多态方面表现出色,但对于一些跨越多个业务模块的横切关注点,如日志记录、事务管理、权限控制等,处理起来显得力不从心。Java AOP(面向切面编程)的出现,为解决这些问题提供了一种全新的思路和方法。

shaozheng0503的博客 1574

AOPSpring AOP

一、前言 二、AOPAOP Spring中的AOP) 2.1 引子:AOPAOP是什么? 官方解释:AOP英文全称Aspect Oriented Program,直译面向切面编程,通过预编译方式或运行期动态代理(根据具体使用何种方式划分静态AOP、动态AOP)实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,利用AOP可以对...

毛毛的专栏 1322

谈谈对AOP的理解 一——认识AOP

前几篇博客我们说了JAVA的代理模式,从静态代理到动态代理,又到CGLIB代理。从静态代理到动态代理是一种进步,JDK的动态代理和CGLIB的代理,却是各有优缺点,在使用过程中,不是非要决出个胜负,根据不同的情景,使用不同的代理;也可以根据情况,两者结合使用,代码是我们写出来的,我们才是创造者,知其然,知其所以然,然可用之。       一、AOP        这篇博客,我们接着代理模式,继

王勇霞 信息技术提高班九期 1万+

通俗易懂的Aop底层原理及Aop使用

介绍了aop底层原理的俩种代理模式还有三种aop的实现

m0_69266818的博客 1198

细说Spring——AOP详解(AOP概览)

一、对AOP的初印象 首先先给出一段比较专业的术语(来自百度):在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方 式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个 热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑 的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高 了开发的效率。 然后我们举一个比较容易理解的例子(

Cx330_0217的博客 4531

Spring AOP】_使用注解编写AOP程序

现aspect包下由AspectDemo、AspectDemo1、AspectDemo2三个切面类,并在每个切面类中实现@Before通知和@After通知。(2)在当前类中,若在其类中实现的切点需要在其他类中使用,则切点必须以public修饰。上述使用方法中,在使用对应注解标注通知方法时,需要重复编写公共切点表达式,这很不方便;@Around:环绕通知,此注解标注的通知方法在目标方法前、后都被执行。2、@Before:前置通知,此注解标注的通知方法在目标方法前被执行;

m0_63299495的博客 959

SpringAOP的作用 为什么要使用AOP

假如没有aop,在做日志处理的时候,我们会在每个方法中添加日志处理,比如 但大多数的日子处理代码是相同的,为了实现代码复用,我们可能把日志处理抽离成一个新的方法。但是这样我们仍然必须手动插入这些方法。 但这样两个方法就是强耦合的,假如此时我们不需要这个功能了,或者想换成其他功能,那么就必须一个个修改。 通过动态代理,可以在指定位置执行对应流程。这样就可以将一些横向的功能抽离出来形成一...

猫的薛定谔 4753

spring-AOPAOP获取request各项参数

AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待。 一 AOP的基本概念 Aspect(切面):通常是一个类,里面可以定义切入点和通知 JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用 Advice(通知):AOP在特定的切入点上执行的增强处理,有before,after,afterReturning,afterThr...

wkNote 1万+

基于注解的AOP

AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程。可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。 我们现在做的一些非业务,如:日志、事务、安全等都会写在业务代码中(也即是说...

从简的博客 5026
上一篇: 封装SpringContext工具类SpringContextUtil
下一篇: HashMap
User_kh
博客等级 码龄10年 1粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值