对 Spring AOP 机制及其配置方式的的总结

Spring-AOP配置管理 阅读详情

1、基本概念梳理

1.1 基本概念

  1. 连接点 (Jointpoint):表示需要在程序中插入横切关注点的扩展点,连接点可能是类初始化、方法执行、方法调用、字段调用或处理异常等等;
  2. 切入点 (Pointcut):选择一组相关连接点的模式,即可以认为连接点的集合;
  3. 通知 (Advice):在连接点上执行的行为,包括前置通知、后置通知、环绕通知,在 Spring 中通过代理模式实现 AOP;
  4. 方面/切面 (Aspect):可以认为是通知、引入和切入点的组合;
  5. 引入 (inter-type declaration):也称为内部类型声明,为已有的类添加额外新的字段或方法;
  6. 目标对象 (Target Object):需要被织入横切关注点的对象,即该对象是切入点选择的对象,需要被通知的对象;
  7. AOP代理 (AOP Proxy):AOP 框架使用代理模式创建的对象,从而实现在连接点处插入通知(即应用切面),就是通过代理来对目标对象应用切面。
    在 Spring 中,AOP 代理可以用 JDK 动态代理或 CGLIB 代理实现,而通过拦截器模型应用切面。
  8. 织入 (Weaving):织入是一个过程,是将切面应用到目标对象从而创建出 AOP 代理对象的过程,织入可以在编译期、类装载期、运行期进行。

AOP的概念关系图

1.2 通知类型

  1. 前置通知 (Before Advice):在切入点选择的连接点处的方法之前执行的通知。
  2. 后置通知 (After Advice):在切入点选择的连接点处的方法之后执行的通知,包括如下类型的后置通知:
    1. 后置返回通知 (After returning Advice):在切入点选择的连接点处的方法正常执行完毕时执行的通知,必须是连接点处的方法没抛出任何异常正常返回时才调用后置通知。
    2. 后置异常通知 (After throwing Advice):在切入点选择的连接点处的方法抛出异常返回时执行的通知,必须是连接点处的方法抛出任何异常返回时才调用异常通知。
    3. 后置最终通知 (After finally Advice):在切入点选择的连接点处的方法返回时执行的通知,不管抛没抛出异常都执行,类似于 Java 中的 finally 块。
  3. 环绕通知 (Around Advices):环绕通知可以在方法调用之前和之后自定义任何行为,并且可以决定是否执行连接点处的方法、替换返回值、抛出异常等等。

考虑一下一个方法从开始到执行结束,其实上面的几个通知类型也就是覆盖了所有可能出现的情况。

1.3 织入

在目标对象的生命周期里可以有多个点进行织入:

  1. 编译器:切面在目标类编译时织入,这种方式需要特殊的编译器,AspectJ 就是使用这种方式织入的;
  2. 类加载期:需要特殊的类加载器,在目标类被引入到应用之前增强该目标类的字节码;
  3. 运行期:织入切面时,AOP 容器会为目标对象动态创建一个代理对象,Spring AOP 就是使用这种方式进行织入的。

Spring 提供了 4 种类型的 AOP 切面:

  1. 基于代理的经典 Spring AOP;
  2. 纯 POJO 面;
  3. @AspectJ 注解驱动的切面;
  4. 注入式 AspectJ 切面

2、基于 XML 配置 AOP

2.1 在 Spring 中使用 AOP

我们用一个简单的例子来测试一下 Spring 的 AOP 功能,这里我们定义了两个类,一个是 Worker,一个是 LogLog。LogLog 有一个名为 say() 的方法,该方法中输出一行文字到控制台。我们希望 Worker 的每个方法在执行的时候都能够调用 LogLog 的 say() 方法。我们可以做如下的配置:

首先,我们要在基本的命名空间基础上增加一行代码来启用 aop 命名空间。此外,我们还要增加schemaLocation 中的配置:

<beans ...
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
    <!-- .... -->
</beans>

然后,我们就可以使用 AOP 来完成我们想要的功能了:

    <!-- 不论是切入点 -->
    <bean id="logLog" class="me.shouheng.spring.aop.LogLog"/>
    <bean id="worker" class="me.shouheng.spring.aop.Worker"/>
    <!-- 配置 AOP -->
    <aop:config>
        <!-- 定义切入点:id 和规则表达式 -->
        <aop:pointcut id="pointcut" expression="execution(* me.shouheng.spring.aop.Worker.*(..)))"/>
        <!-- 定义切面:指定切面引用的 Bean 及其方法,切入点 -->
        <aop:aspect ref="logLog">
            <aop:before method="say" pointcut-ref="pointcut"/>
            <aop:after method="say" pointcut-ref="pointcut"/>
        </aop:aspect>
    </aop:config>

以上的配置没有问题,我们可以实现期望的功能。

这里,我们可以看出,即使是 AOP 也是需要目标对象和切点定义成 Bean。pointcut 是所有方法的一个合集,我们使用 expression 来指定这些方法的规则。aspect 整合了切入点和通知,它需要引用 Bean,并且在子标签中将通知类型、要执行的方法和切入点结合起来。

另外,还需要注意的是,切入点和切面都可以被定义多个,但是是有顺序要求的。除了使用 pointcut-ref 引用某个切入点,还可以使用匿名的切入点:

    <aop:after method="say" pointcut="execution(* me.shouheng.spring.aop.Worker.*(..)))"/>

总结:切面需要引用 Bean,然后指定切入点上执行的该 Bean 的方法。切入点不是 Bean 类型,它是一种表达式规则,用来指定被切入的方法的规则。

OK,实际上,如果你是第一次接触 AOP 的话,看 AOP 的配置的时候还是比较费解的。那么,我们抛开相关文档,自己去想一下实际开发过程中可能会需要哪些功能,并看它们如何配置和实现好了。

我们从几个通知作为思考的起点:

  1. 前置通知:我想要知道方法的所有入参,我可以用它来记录一些日志
  2. 后置返回通知:我想要知道返回的结果是什么,我可以把不机密但重要的信息放在日志里面
  3. 后置异常通知:我想要知道具体出现的异常的类型和异常的具体信息,以把它们记录到日志中,或者根据具体的错误原因做一些其他的处理,比如翻译之后返回给客户端
  4. 后置最终通知:同上
  5. 环绕通知:同上

所以,总结一下我们想要获取的无非下面三个信息:

  1. 方法的参数
  2. 方法的返回结果
  3. 异常的详情

那么,我们接下来就看使用 AOP 如何获取这三个信息。

2.2 获取方法的入参

如下所示,我们这里企图拦截 Worker 类中的所有的包含一个名为 words 参数的方法,然后我们使用 logLog 的 sayWords() 方法进行拦截,并在方法执行之前输出该参数:

    <!-- 定义切面:切面执行的 Bean 是 logLog -->
    <aop:aspect ref="logLog">
        <!-- 定义切入点规则 -->
        <aop:pointcut id="pointcut" expression="execution(* me.shouheng.spring.aop.Worker.working(..)) and args(words)"/>
        <!-- 定义什么时候切入以及在切入点上执行的方法 -->
        <aop:before pointcut-ref="pointcut" method="sayWords" arg-names="words"/>
    </aop:aspect>

注意,这里我们在切点的定义中使用 and 表示要符合两种情况,我们也可以用两个 &&(在 XML 中是 &amp;&amp;)来表示,但是显然前者更加简洁。当我们要拦截的方法中包含多个参数的时候,也可以同时在 args 中指定,只要注意用 , 分隔开即可。

2.3 获取方法的返回结果

为了测试获取方法返回结果,我们在 Worker 中增加了一个新的方法 makeA(),它返回一个字符串类型的数据。我们按照如下所示的方式来获取并使用方法的返回结果:

    <aop:aspect ref="logLog">
        <!-- 定义切入点 -->
        <aop:pointcut id="p2" expression="execution(* me.shouheng.spring.aop.Worker.makeA())"/>
        <!-- 定义要拦截的事件以及相关的参数等 -->
        <aop:after-returning method="sayWords" pointcut-ref="p2" returning="words"/>
    </aop:aspect>

在定义了切点之后,我们使用 aop:after-returning 标签来获取方法的返回值并对其进行处理。这里我们用了 logLog 的 sayWords() 方法,使用 returning 属性指定返回值应用到 sayWords() 方法的参数的名称。

以上程序执行的最终效果就是,在执行了 makeA() 方法之后,将返回的结果作为 words 参数传入到 sayWords() 方法中。

需要注意的地方是,需要使用 aop:after-returning 标签才能获取方法的返回结果并进行处理。

2.4 获取方法的执行的异常

为了测试拦截异常的逻辑,我们需要在 LogLog 类中增加一个方法 handleError(Throwable throwable)。我们还要在 Worker 中定义一个 throwMethod() 方法,它内部抛出一个异常。然后我们进行如下的配置:

    <aop:aspect ref="logLog">
        <!-- 定义切入点规则 -->
        <aop:pointcut id="p3" expression="execution(* me.shouheng.spring.aop.Worker.throwMethod())"/>
        <!-- 拦截异常事件并执行拦截的参数信息等 -->
        <aop:after-throwing method="handleError" pointcut-ref="p3" throwing="throwable"/>
    </aop:aspect>

拦截异常和拦截方法执行结果的逻辑类似,我们需要指定一个方法,然后在 throwing 属性中指定该方法中的参数的名称。当抛出异常的时候,就会把异常作为该参数传入到方法中,我们可以在方法中对异常进行处理。

2.5 环绕通知

环绕通知和上面的几种通知略有不同,你可以在通知方法种指定一个 ProceedingJoinPoint 类型的参数,并按照下面的方式配置:

    public void say2(ProceedingJoinPoint joinPoint) {
        try {
            System.out.println("===========before");
            joinPoint.proceed();
            System.out.println("===========after");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            System.out.println("==========exception");
        } finally {
            System.out.println("===========finally");
        }
    }

当我们调用 joinPoint.proceed() 的时候,实际上是在执行被代理的方法,我们可以像上面这样在各个它调用前、后和出现异常的时候进行处理。而在 XML 中配置的时候,配置的方式和普通的切面定义完全一样:指定切面和方法名即可。

2.6 advisor

在 AOP 的 XML 配置方式中,<aop:aspect> 标签中可用的标签共 3 个:<aop:pointcut>、<aop:aspect> 和 <aop:advisor>.

advisor 是切面和切入点的结合,<aop:advisor> 标签的使用类似于环绕方法。在使用的时候,我们先要定义一个 Bean 用来定义拦截时的处理逻辑:

public class MethodHandler implements MethodInterceptor {
    @Override
    public Object invoke(MethodInvocation methodInvocation) throws Throwable {
        System.out.println("++++++before advice");
        try {
            methodInvocation.proceed();
        } catch (Exception ex) {
            System.out.println("++++++catch advice");
        }
        System.out.println("++++++after advice");
        return null;
    }
}

然后,在 XML 中通过 <aop:advisor> 标签来进行配置:

    <!-- 定义 Bean -->
    <bean id="handler" class="me.shouheng.spring.aop.MethodHandler"/>
    <!-- 定义 Advisor -->
    <aop:config>
        <aop:advisor advice-ref="handler" id="advisor" pointcut-ref="pointcut"/>
    </aop:config>

2.7 总结

切面并没有什么特别复杂的东西,无非是对一些规则是否熟练的问题。AOP 本身是一种工具或者开发思想,主要用来对方法进行统一的处理。我们可以获取要执行方法的参数信息、返回结果和抛出的异常等等,并根据它们来做不同的动作。

3、使用 @Aspect 配置 AOP

除了使用基于 XML 配置 AOP,还可以使用注解来进行配置。Spring 默认不支持 @AspectJ 风格的切面声明,为了支持需要使用如下配置:

    <aop:aspectj-autoproxy/>  

然后,我们就可以进行配置和使用了。如果你用的式基于 Java 的配置方式,你还需要在使用 @Configuration 注解的配置类上面使用 @EnableAspectJAutoProxt 来启用自动代理。该注解的作用和当前标签的作用相同,只是对应于不同的配置方式。

使用注解的方式和使用 XML 配置的方式基本类似,我们看下下面的代码。

首先是切面的定义:

    @Aspect
    public class AspectObj {

        // 定义切点
        @Pointcut(value = "execution(* me.shouheng.spring.aspect.*.*(..)) && args(params)", argNames = "params")
        public void pointcut(String params) { 
        }

        // 定义切点方法执行之前执行的逻辑
        @Before(value = "pointcut(params)", argNames = "params")
        public void before(String params) {
            System.out.println("================= before =================");
        }
    }

这里我们使用 @Aspect 注解,它表明该类是一个切面。然后,我们定义一个方法体为空的方法,并使用 @Pointcut 注解,表明它是一个切点。可以看出它的配置方式和使用 XML 基本一样。

然后,我们需要定义一个通知,这里我们用的是前置通知,我们用 @Before 注解声明方法为前置通知,并指定切点和方法的参数名。

配置完这些之后,我们定义一个测试类,来看一下我们的是否能够在方法执行之前拦截到方法,并获取到方法的参数。我们定义一个名为 HelloAspect 的类,并在其中定义一个方法:

    public void sayHello(String params) {
        System.out.println("Hello, " + params);
    }

这样我们需要在 XML 中将上述定义的两个类作为 Bean 声明在 XML 中,这样它们就可以被 IoC 管理了。OK,我们获取上下文之后调用 Bean 的方法确实可以达到我们预期的效果。

以上是基于注解的 AOP 的基本配置方式,其他类型的通知的配置方式与其基本相似,我们只要知道其中的逻辑就可以了,没必要面面俱到。

附录

1、切面表达式

在这里总结下 Spring 中常用到的通配符、操作符和指示器。它们一起用来指定切入点的方法的规则。

1.1 通配符

符号含义
..任意参数列表,任何数量的包
+给定类的任何子类
*任何数量的字符

1.2 操作符

符号含义
&&与操作,两个条件都成立才成立
||或操作,两个条件一个成立即成立
!非操作,不满足条件的时候成立

1.3 指示器

Spring 中常用到的指示器包括下面几种类型:

Spring AOP 指示器

类签名表达式 whithin(<type name>)
表达式含义
within(my.palm..*)匹配 my.palm 及其子包中所有类的所有方法
within(my.palm.ClassName)匹配 my.palm.ClassName 类中所有方法
within(MyInterface+)匹配 MyInterface 接口所有实现类的所有方法
within(my.palm.BaseClass)匹配 my.palm.BaseClass 及其子类的所有方法

方法签名 execution(<scope> <return type> <full-qulified-class-name>.<method>(params))

表达式含义
execution(* my.shouhengn.Palm.*(..))my.shouhengn.Palm 中所有方法
execution(public * my.shouhengn.Palm.*(..))my.shouhengn.Palm 中所有公共方法
execution(public * my.shouhengn.Palm.*(long,..))my.shouhengn.Palm 中所有第一个参数为 long 型的公共方法
execution(public String my.shouhengn.Palm.*(..))my.shouhengn.Palm 中所有返回类型为 String 的公共方法

其他

表达式含义
bean(*Service)所有后缀名为 Service 的 Bean
@anotation(my.shouheng.Annotation)所有使用 Annotaion 注解的方法会被调用
@within(my.shouheng.Annotation)所有使用 Annotaion 注解的类的方法会被调用
this(my.shouheng.MyInterface)所有实现了 my.shouheng.MyInterface 接口的代理对象的方法会被调用

这部分内容的重点是 execution() 类型的指示器,其他的可以作为了解内容,需要使用到的时候知道如何使用即可。

深入浅出ISP:用RKISP2.x Tuner工具理解AWB、AE、HDR等核心模块的实战调参 本文深入解析RKISP2.x Tuner工具在ISP图像处理中的实战应用,重点探讨AWB、AE、HDR等核心模块的调参技巧。通过环境搭建、调试工具使用和实际案例,帮助开发者掌握如何在不同光照条件下优化图像质量,实现精准的白平衡、曝光控制和动态范围处理。 阅读详情

相关推荐

FFmpeg音频转换避坑实录:为什么VOS的REC转MP3比WAV转MP3体积小一半?

本文深入解析了FFmpeg在VOS系统REC格式音频转换中的优化技巧,揭示了REC转MP3比WAV转MP3体积小一半的原因。通过分析REC格式的压缩特性、转码参数陷阱及FFmpeg调优方法,帮助开发者实现高效音频转换,显著降低存储成本。

weixin_30752699的博客 526

SpringAOP中的JointPoint和ProceedingJoinPoint使用总结

一、Joint Point JointPoint是程序运行过程中可识别的点,这个点可以用来作为AOP切入点。JointPoint对象则包含了和切入相关的很多信息。比如切入点的对象,方法,属性等。我们可以通过反射的方式获取这些点的状态和信息,用于追踪tracing和记录logging应用信息。 二、Pointcut pointcut 是一种程序结构和规则,它用于选取join point并收集这些point的上下文信息。 pointcut通常包含了一系列的Joint Point,我们可以通过pointcut来同

huluwa10526的博客 5119

STC8单片机低功耗延时优化实践:从循环等待到定时唤醒

本文深入探讨了STC8单片机低功耗延时优化的核心方法,即利用掉电唤醒定时器(WKT)替代传统的循环等待,实现从“空转耗电”到“定时唤醒”的转变。通过实战代码演示了如何编写低功耗延时函数,将待机电流从mA级降至μA级,并分析了精度、唤醒时间等关键权衡点,为电池供电的物联网设备提供了有效的续航优化方案。

pea55的博客 324

AOP简单相关配置

AOP简单相关配置

qq_40432598的博客 1109

文石NoteX3国行版安装 Google Play经验分享

文石NoteX3国行版安装 Google Play经验分享。

2301_80693261的博客 7589

6、Cocos2D游戏开发:精灵添加与角色实现

本文详细介绍了在Cocos2D游戏开发中如何添加背景精灵和玩家角色精灵。通过创建GameScene场景、组织项目资源、使用多分辨率图像适配不同设备,并深入讲解了将角色拆分为上下半身以实现更真实瞄准效果的原理。文章还解析了Cocos2D的图像搜索机制、锚点概念及其应用,以及如何通过父子节点关系管理复合角色。最终实现了猎人角色在场景中的正确显示与定位,为后续动画和交互功能打下基础。

e3f4g5的博客 90

【spring aop】连接点(Jointpoint)、切入点(Pointcut)、增强(Advice)、方面/切面(Aspect、Advisor)

文章目录前言1. 先来回顾一下AOP中的一些术语2. 增强方式简介2.1 MethodBeforeAdvice前置增强2.2 AfterReturningAdvice后置增强2.3 ThrowsAdvice异常增强2.4 MethodInterceptor环绕增强2.5 执行结果3. 总结 前言 上一章节《静态代理模式和JDK、CGLIB动态代理》分析了静态代理和JDK、CGLIB动态代理,接下来我们还要回顾一下AOP的一些相关知识,以方便为接下来分析AOP的源码做好准备。 1. 先来回顾一下AOP中的一些

m0_45406092的博客 5240

什么是DHCP Snooping?如何配置DHCP Snooping?

功能描述防护类型防御伪造 DHCP 服务器、避免地址冲突、增强网络安全性使用场景企业园区网、校园网、大型局域网配合机制IP Source Guard、DAI、防止 ARP 欺骗部署难度⭐⭐(简单)“DHCP Snooping,是内网 DHCP 安全防护的第一道门神。” 🛡️。

网络技术联盟站 1264

SpringAOP的JoinPoint类、Proceedingjoinpoint 类详解,AOP环绕通知获取注解信息

SpringAOP的JoinPoint类、Proceedingjoinpoint 类详解,AOP环绕通知获取注解信息

Little_Arya的博客 1万+

3、提升管壳式换热器能效:双螺旋盘管的应用研究

本研究探讨了在管壳式热交换器中应用双螺旋盘管以提升能效的可行性。通过实验对比双螺旋与单螺旋盘管的热传递效率,结果显示双螺旋盘管达到54.33%的效率,显著优于单螺旋的48.88%。双螺旋结构不仅增大了换热面积,还因产生剪切应力而减少结垢,延长运行周期。采用NTU方法评估热传递性能,验证了该设计在工业应用中的高效性与实用性,建议在制冷、空调、石油精炼等领域推广使用。

k8s6orchestrator的博客 106

基于STM32设计的智能水产养殖系统(2025)_359

本设计提出并实现了一种基于STM32F103RCT6微控制器的智能水产养殖控制系统,针对传统水产养殖中人工依赖高、环境参数监测滞后、控制手段单一等问题,集成了TDS水质检测、水温检测、水位监测、自动喂食、自动充氧、换水控制与加热保温等功能。系统采用ESP8266模块实现WIFI联网,通过MQTT协议将关键数据上传至华为云物联网平台,支持Android手机APP和Windows上位机远程监测与控制。同时,系统具备本地LCD数据显示与蜂鸣器异常报警功能,支持本地按键控制操作。整套系统功能完善,响应灵敏,运行稳定

624

【Spring aop】Spring aop的XML和注解的两种配置实现

一:XML形式配置 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context

flysun的博客 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java AOP & Spring AOP 原理和实现

转载:http://www.cnblogs.com/hongwz/p/5764917.html 1. AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OO...

csdn_life18的博客 744

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

spring实战学习(四)AOP及其实现方式

什么是AOP? aop指的是面向切面编程,它本质上是一种技术。在企业开发中,很多应用的一些模块像日志,安全,事务等它们在多个应用中都存在,我们就可以将它们提取出来作为切面,这样能够让我们能加关注于业务层面,也减少了很多重复代码的编写。 AOP的几个专业名词 连接点(Joinpoint):目标对象中,所有可以增强的方法。 切入点(Pointcut):目标对象中,已经增强的方法 通知/增强(Advic...

风影 190

Spring 提供了哪些配置方式?什么是Spring装配?什么是AOP?AOP 有哪些实现方式?Spring AOP 和 AspectJ AOP 有什么区别?

当 bean 在 Spring 容器中组合在一起时,它被称为装配或 bean 装配。Spring 容器需要知道需要什么bean以及容器应该如何使用依赖注入来将 bean 绑定在一起,装配 bean。Spring 容器能够自动装配 bean,可以通过检查 BeanFactory 的内容,让 Spring 自动解析 bean 的协作者。

xiaozhi6yyy18的博客 745

Spring AOP 超详细分析

Spring核心机制之 AOP 文章目录Spring核心机制之 AOP1. Spring AOP简介AOP的优点2. AOP例子实践1. 案例起源2. 静态代理实现AOP3. 动态代理实现AOP1. 动态代理类的实现2. 测试3. 结果分析3. Spring中的AOP1. 第一步:创建一个切面类:LoggerAspect2. XML中的配置3. 测试4. AOP术语解释1. Aspect(切面类)...

eternal_yy 478

spring-AOP

Spring的AOP理解 抽取方法的公共部分,而不是对象的公共部分 OOP面向对象,允许开发者定义纵向的关系,但并适用于定义横向的关系,导致了大量代码的重复,而不利于各个模块的重用。 (OOP, Object Oriented Programming,OOD(面向对象的设计),OOA(面向对象的分析)) AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,

无云无声的博客 486

spring AOP

复习了一下Spring,发现忘了很多东西了。特别是AOP这一块儿,于是认真看了看,写篇文章总结总结。 两种代理(jdk Proxy, cglib),三种实现方式.(aspectJ,xml,api) 概念 AOP(Aspect Oriented Programming),即面向切面编程(也叫面向方面编程,面向方法编程)。其主要作用是,在不修改源代码的情况下给某个或者一组操作添加额外的功能。像日

For that dream 550

Spring相关文档翻译-chapter9(AOP部分)

(本文的翻译基于Spring 4帮助文档。9.6以后的部分未翻译,因为感觉那些内容会很少用到,即便用到那点资料也不够。这里只是保留其提纲。) 9.1 简介 面向切面编程(AOP)为面向方面编程(OOP)提供了另一种角度来实现代码结构。OOP模块的基本单元是class文件,而AOP模块的基本单元是切面。切面使得类似于事务管理的概念模块化,这些模块可以切入多个类和对象中。 Spring一个主要的

lh87522的专栏 1826

Spring源码详解之AOP

Spring AOP(面向切面编程)是Spring框架的重要模块,它通过动态代理的方式将横切关注点(如事务管理、日志、权限控制等)与业务逻辑解耦,从而实现代码复用和模块化。AOP的底层实现主要依赖JDK动态代理和Cglib动态代理:前者适用于接口代理,后者则通过生成子类增强类方法。Spring在加载AOP相关xml配置或注解时,会解析并创建相应的切面、通知与代理对象,并在运行时通过拦截器链完成方法调用增强。整个调用流程包括目标对象方法执行前后的增强逻辑插入,从而在不改变源代码的前提下实现功能扩展。开发者既可

404 Not Found 374

AOP介绍

AOP介绍 AOP(Aspect Oriented Programing)面向切面编程是通过预编译方式或者是运行期期间动态代理实现功能扩展而不用修改源代码通过AOP技术,实现一种通用的逻辑解耦,解决一些系统层面的问题,如日志,事务,权限等,从而实现高可用的可重用性和可维护性AOP的设计原理和思想 AOP横向抽象技术的介绍 pubic class User{ //添加用户方法 public void add(){ //添加逻辑 //修改源代码,添加日志功能 } } //扩展功能 添加日志功能

xasasaa的博客 3764

【Spring5】IOC、AOP、事务

Spring5IOCIOC底层原理IOC过程IOC容器IOC 操作 Bean 管理基于 xml创建对象注入属性使用 set 方法进行注入使用有参数构造进行注入p 名称空间注入(了解)xml自动装配外部属性文件基于注解创建对象属性注入@Autowired:根据属性类型进行自动装配@Qualifier:根据名称进行注入@Resource:可以根据类型注入,可以根据名称注入@Value:注入普通类型属性完全注解开发Spring的两种Bean用FactoryBean实现工厂Beanbean作用域bean生命周期AO

flora 236

Spring注解和AOP实现

1.本章任务 完成IOC方式使用 完成动态代理 完成AOP注解使用 完成AOPxml使用 2.知识点 Spring框架中有注释和xml两种配置方式,包括Spring中的IOC和AOP也一样,都有XML和注解两种方式,两种方式各有千秋. 2.1xml和注解的区别 2.1.1xml配置 优点有: 1.xml配置方式进一步降低了耦合,使得应用更加容易扩展,是对配置文件进一步修改也不需要工程修改和重新编译. 2.在处理大量业务的时候,用xml配置用该更加好一些.因为xml更加清晰的表名了各个对象之间的关系,各个业务

shama_的博客 786

spring的aop

原文:http://hi.baidu.com/zhong8880/blog/item/3d0c3ce97f657235b80e2def.html一:aop简介 1: 定义:将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。 (联想过滤器filter) 2:aop的实现方式 (1):静态织入(最复杂,最强大) 在编译阶段,通过特殊的编译器来实现把切面织入到目标对象 (2):加载织入 在类的加载阶段,通过classloader实现把切面织入到

Rogue-Creasy 881

Spring 学习 3- AOP

什么是AOP aop就是纵向的编程,业务1和业务2都需要一个共同的操作,与其往每个业务中都添加同样的代码,不如写一遍代码,让两个业务共同使用这段代码。 spring中面向切面编程用的是代理模式,它的实现有两种方式,一种是动态代理, 参考:深入理解Java反射+动态代理 一种是CGLIB,动态代理必须要提供接口,而CGLIB实现是有继承。 AOP(Aspect-Orien...

122

spring的aop_spring aop源码解读

spring aop介绍面向切面编程是一种编程思想,解决的场景是将项目中一些零散的,通用的逻辑从原业务逻辑的硬编码调用中脱离出来,并在运行时再动态的编织进去。这就是面向切面技术,如日志,注解等功能就经常采用切面技术。spring aop是spring的一项核心功能,采用的是动态代理的思想,主要有jdk自身的动态代理和cglib动态代理两种。说到代理,我们看下代理模式的类图:进入正题我们知道了spr...

weixin_39849418的博客 67
上一篇: 对 Spring IOC 机制及其配置方式的的总结
下一篇: 对 Spring 事务管理机制及其配置方式的总结
开发者如是说
博客等级 码龄10年 67粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值