Spring(二)——AOP

Spring——AOP(二)基于XML实现AOP 2基于XML实现AOP XML配置实现AOP:通过XML配置AOP是Spring框架专有的,但由于AspectJ得到越来越多的AOP框架支持,所以通过注解实现AOP将会有更多重用的机会。通过XML配置实现AOP代码如下: CalculatorAspect类: package com.jd.calculator; import org.aspectj.lang.JoinPoint; p... 阅读详情

一、AOP术语

1、切面(Aspect): 横切关注点(跨越应用程序多个模块的功能)被模块化的特殊对象
2、通知(Advice): 切面必须要完成的工作
3、目标(Target): 被通知的对象
4、代理(Proxy): 向目标对象应用通知之后创建的对象
5、连接点(Joinpoint):程序执行的某个特定位置:如类某个方法调用前、调用后、方法抛出异常后等。连接点由两个信息确定:方法表示的程序执行点;相对点表示的方位。例如 ArithmethicCalculator#add() 方法执行前的连接点,执行点为 ArithmethicCalculator#add(); 方位为该方法执行前的位置
6、切点(pointcut):每个类都拥有多个连接点:例如 ArithmethicCalculator 的所有方法实际上都是连接点,即连接点是程序类中客观存在的事务。AOP 通过切点定位到特定的连接点。
类比:连接点相当于数据库中的记录,切点相当于查询条件。切点和连接点不是一对一的关系,一个切点匹配多个连接点,切点通过 org.springframework.aop.Pointcut 接口进行描述,它使用类和方法作为连接点的查询条件。

二、AOP的实现——AspectJ

AOP可以通过AspectJ注解进行配置,也可以通过XML配置。这里推荐使用AspectJ注解,下面的实例也都是通过AspectJ举例,XML配置将被放在最后进行简单说明。

关于AspectJ:

AspectJ是Java 社区里最完整最流行的 AOP 框架。

在Spring中启动 AspectJ支持:

1、要在 Spring 应用中使用 AspectJ 注解, 必须在 classpath 下包含 AspectJ 类库: aopalliance.jar、aspectj.weaver.jar 和 spring-aspects.jar
2、将 aop Schema 添加到 <beans> 根元素中.
3、要在 Spring IOC 容器中启用 AspectJ 注解支持, 只要在 Bean 配置文件中定义一个空的 XML 元素 <aop:aspectj-autoproxy>
4、当 Spring IOC 容器侦测到 Bean 配置文件中的 <aop:aspectj-autoproxy> 元素时, 会自动为与 AspectJ 切面匹配的 Bean 创建代理.

三、声明切面、通知

要在 Spring 中声明 AspectJ 切面, 只需要在 IOC 容器中将切面声明为 Bean 实例.
当在 Spring IOC 容器中初始化 AspectJ 切面之后, Spring IOC 容器就会为那些与 AspectJ 切面相匹配的 Bean 创建代理.
在 AspectJ 注解中, 切面只是一个带有 ==@Aspect== 注解的 Java 类.

通知是标注有某种注解的简单的 Java 方法.
AspectJ 支持 5 种类型的通知注解:
@Before: 前置通知, 在方法执行之前执行
@After: 后置通知, 在方法执行之后执行
@AfterRunning: 返回通知, 在方法返回结果之后执行
@AfterThrowing: 异常通知, 在方法抛出异常之后
@Around: 环绕通知, 围绕着方法执行

一个切面可以包括一个或者多个通知

举例:

切入表达式:
如上面的方法中@Before(“execution(* ArithmeticCalculator.add(..))”)
最典型的切入点表达式时根据方法的签名来匹配各种方法, 例如:
execution * com.atguigu.spring.ArithmeticCalculator.*(..): 匹配 ArithmeticCalculator 中声明的所有方法,第一个 * 代表任意修饰符及任意返回值. 第二个 * 代表任意方法. .. 匹配任意数量的参数. 若目标类与接口与该切面在同一个包中, 可以省略包名.
execution public * ArithmeticCalculator.*(..): 匹配 ArithmeticCalculator 接口的所有公有方法.
execution public double ArithmeticCalculator.*(..): 匹配 ArithmeticCalculator 中返回 double 类型数值的方法
execution public double ArithmeticCalculator.*(double, ..): 匹配第一个参数为 double 类型的方法, .. 匹配任意数量任意类型的参数
execution public double ArithmeticCalculator.*(double, double): 匹配参数类型为 double, double 类型的方法.

合并切入表达式:
在 AspectJ 中, 切入点表达式可以通过操作符 &&, ||, ! 结合起来.
enter description here

让通知访问当前连接点的细节:
可以在通知方法中声明一个类型为 JoinPoint 的参数. 然后就能访问链接细节. 如方法名称和参数值
enter description here

常用方法:
JointPoint.getSignatrue.getName():获得方法名
JoinPoint.getArgs():获得参数值

前置通知

前置通知:在方法执行之前执行的通知
前置通知使用 @Before 注解, 并将切入点表达式的值作为注解值.

    @Before("declareJointPointExpression()")
    public void beforeMethod(JoinPoint joinPoint) {
        String methodName = joinPoint.getSignature().getName();
        Object[] args = joinPoint.getArgs();
        System.out.println("The method "+methodName+" begins with "+Arrays.asList(args));
    }

后置通知

后置通知是在连接点完成之后执行的, 即连接点返回结果或者抛出异常的时候, 下面的后置通知记录了方法的终止.
无论连接点是正常返回还是抛出异常, 后置通知都会执行.
如果只想在连接点返回的时候记录日志, 应使用 返回通知 代替后置通知.

    @After("declareJointPointExpression()")
    public void afterMethod(JoinPoint joinPoint) {
        String methodName = joinPoint.getSignature().getName();
        System.out.println("The method "+methodName+" ends");
    }

返回通知

在返回通知中, 只要将 ==returning 属性==添加到 ==@AfterReturning== 注解中, 就可以访问连接点的返回值. 该属性的值即为用来传入返回值的参数名称.
必须在通知方法的签名中添加一个同名参数. 在运行时, Spring AOP 会通过这个参数传递返回值.
原始的切点表达式需要出现在 pointcut 属性中

/**
     * 返回通知
     * 在方法正常结束后执行的代码,可以访问到方法的返回值!
     * @param joinPoint
     * @param result :方法返回值
     */
    @AfterReturning(value="declareJointPointExpression()",returning="result")
    public void afterReturning(JoinPoint joinPoint,Object result){
        String methodName = joinPoint.getSignature().getName();
        System.out.println("The method "+methodName+" ends with "+result);
    }

异常通知

只在连接点抛出异常时才执行异常通知
将 ==throwing 属性==添加到 ==@AfterThrowing== 注解中, 也可以访问连接点抛出的异常.
Throwable 是所有错误和异常类的超类. 所以在异常通知方法可以捕获到任何错误和异常.
如果只对某种特殊的异常类型感兴趣, 可以将参数声明为其他异常的参数类型. 然后通知就只在抛出这个类型及其子类的异常时才被执行.

     /**
     * 异常通知
     * 在目标方法发生异常时会执行的方法,可以访问到异常对象,且可以指定在出现特定异常时再执行(写在参数里)
     * @param joinPoint
     * @param ex
     */
    @AfterThrowing(value="declareJointPointExpression()",throwing="ex")
    public void afterThrowing(JoinPoint joinPoint,Exception ex) {
        String methodName = joinPoint.getSignature().getName();
        System.out.println("The method "+methodName+" occurs exception :"+ex);
    }

环绕通知

环绕通知是所有通知类型中功能最为强大的, 能够全面地控制连接点. 甚至可以控制是否执行连接点.
对于环绕通知来说, 连接点的参数类型必须是 ==ProceedingJoinPoint== . 它是 JoinPoint 的子接口, 允许控制何时执行, 是否执行连接点.
在环绕通知中需要明确调用 ==ProceedingJoinPoint 的 proceed() 方法==来执行被代理的方法. 如果忘记这样做就会导致通知被执行了, 但目标方法没有被执行.
注意: 环绕通知的方法需要返回目标方法执行之后的结果, 即调用 joinPoint.proceed(); 的返回值, 否则会出现空指针异常

/**
     * 环绕通知(功能最全,但是不常用)
     * 需要ProceedingJoinPoint 类型的参数
     * 环绕通知类似于动态代理全过程:ProceedingJoinPoint 类型的参数可以觉得是否执行目标方法
     * 环绕通知必须有返回值,返回值即目标方法的返回值
     * @param pjd
     */
    @Around("execution( public int com.spring.aop.ArithmeticCalculator.*(..))")
    public Object aroundMethod(ProceedingJoinPoint pjd) {
        System.out.println("aroundMethod");

        Object result = null;
        String methodName = pjd.getSignature().getName();

        //执行目标方法
        try {
            //前置通知
            System.out.println("(around)The mehod "+ methodName + " begins with "+pjd.getArgs());

            result = pjd.proceed();

            //后置通知
            System.out.println("(around)The mehod "+ methodName + " ends with"+ result);
        } catch (Throwable e) {
            //异常通知
            System.out.println("(around)The method occurs exception with"+ e);
            throw new RuntimeException();
        }

        //后置通知
        System.out.println("(around)The method ends~");
        return result;
    }

整合后的代码:

ArithmeticCalculator是一个超类,通过一个子类ArithmeticCalculatorImpl实现

public interface ArithmeticCalculator {
    int add(int i, int j);
    int sub(int i, int j);

    int mul(int i, int j);
    int div(int i, int j);
}

LoggingAspect是一个切面,也是一个Java类,通过这个类实现通知

import java.util.Arrays;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Order(2) //这里是为切面设置优先级,当有多个切面的时候,将起作用。数字越小优先级越高
@Component //这里将切面声明为 Bean 实例. 通过注解加入IoC容器
@Aspect//声明一个切面
public class LoggingAspect {

    /**
     * 定义一个方法,用于声明切入点表达式,方法中不需要填入其他的代码
     * 使用@Pointcut来声明切入点表达式
     * 后面的其他通知直接使用方法名来引用当前的切入点表达式
     */
    @Pointcut("execution( public int com.spring.aop.ArithmeticCalculator.*(..))")
    public void declareJointPointExpression() {

    }
    /**
     * 前置通知
     * 在ArithmeticCalculator接口的每一个实现类的每一个方法开始之前执行一段代码
     * @param joinPoint
     */
    @Before("declareJointPointExpression()")
    public void beforeMethod(JoinPoint joinPoint) {
        String methodName = joinPoint.getSignature().getName();
        Object[] args = joinPoint.getArgs();
        System.out.println("The method "+methodName+" begins with "+Arrays.asList(args));
    }

    /**
     * 后置通知
     * 在ArithmeticCalculator接口的每一个实现类的每一个方法执行之后执行的方法,无论方法是否发生异常
     * @param joinPoint
     */
    @After("declareJointPointExpression()")
    public void afterMethod(JoinPoint joinPoint) {
        String methodName = joinPoint.getSignature().getName();
        System.out.println("The method "+methodName+" ends");
    }

    /**
     * 返回通知
     * 在方法正常结束后执行的代码,可以访问到方法的返回值!
     * @param joinPoint
     * @param result :方法返回值
     */
    @AfterReturning(value="declareJointPointExpression()",returning="result")
    public void afterReturning(JoinPoint joinPoint,Object result){
        String methodName = joinPoint.getSignature().getName();
        System.out.println("The method "+methodName+" ends with "+result);
    }


    /**
     * 异常通知
     * 在目标方法发生异常时会执行的方法,可以访问到异常对象,且可以指定在出现特定异常时再执行(写在参数里)
     * @param joinPoint
     * @param ex
     */
    @AfterThrowing(value="declareJointPointExpression()",throwing="ex")
    public void afterThrowing(JoinPoint joinPoint,Exception ex) {
        String methodName = joinPoint.getSignature().getName();
        System.out.println("The method "+methodName+" occurs exception :"+ex);
    }

    /**
     * 环绕通知(功能最全,但是不常用)
     * 需要ProceedingJoinPoint 类型的参数
     * 环绕通知类似于动态代理全过程:ProceedingJoinPoint 类型的参数可以觉得是否执行目标方法
     * 环绕通知必须有返回值,返回值即目标方法的返回值
     * @param pjd
     */
    /*@Around("execution( public int com.spring.aop.ArithmeticCalculator.*(..))")
    public Object aroundMethod(ProceedingJoinPoint pjd) {
        System.out.println("aroundMethod");


        Object result = null;
        String methodName = pjd.getSignature().getName();

        //执行目标方法
        try {
            //前置通知
            System.out.println("(around)The mehod "+ methodName + " begins with "+pjd.getArgs());

            result = pjd.proceed();

            //后置通知
            System.out.println("(around)The mehod "+ methodName + " ends with"+ result);
        } catch (Throwable e) {
            //异常通知
            System.out.println("(around)The method occurs exception with"+ e);
            throw new RuntimeException();
        }

        //后置通知
        System.out.println("(around)The method ends~");
        return result;
    }*/
}

VlidationAspect是第二个Aspect切面,通过order指定优先级


//Order注解指定切面的优先级:数字越小优先级越高
@Order(1)
@Component
@Aspect
public class VlidationAspect {

    @Before("LoggingAspect.declareJointPointExpression()")
    public void validateArgs(JoinPoint joinPoint) {
        System.out.println("->validate: "+Arrays.asList(joinPoint.getArgs()));
    }
}

xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <!-- 自动扫描的包 -->
    <context:component-scan base-package="com.spring.aop"></context:component-scan>

    <!-- 使 AspectJ 的注解起作用 -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

</beans>

下面是主类

public class Main {

    public static void main(String[] args) {
        ApplicationContext ctx  = new ClassPathXmlApplicationContext("applicationContext.xml");
        ArithmeticCalculator arithmeticCalculator = (ArithmeticCalculator) ctx.getBean("arithmeticCalculator");

        System.out.println(arithmeticCalculator.getClass().getName());
        int result = arithmeticCalculator.add(1, 2);
        System.out.println("(main)result:" + result);

        result = arithmeticCalculator.div(200, 10);
        System.out.println("(main)result:"+result);
    }
}

执行结果:

com.sun.proxy.$Proxy12
->validate: [1, 2]
The method add begins with [1, 2]
The method add ends
The method add ends with 3
(main)result:3
->validate: [200, 10]
The method div begins with [200, 10]
The method div ends
The method div ends with 20
(main)result:20
【React】1、React入门与概览(JSX语法) React入门 文章目录React入门一、React全家桶1. React是什么?2. 谁开发的?3. 为什么要学?4. React的特点5. 学习React之前要掌握的JavaScript基础知识二、React 概览组件JSXVirtual DOM关于虚拟DOM:Data Flow三、React基本使用相关js库四、React JSXJSX 语法规则五、模块与组件、模块化与组件化的理解5.1 模块5.2 组件5.4 模块化5.5 组件化 一、React全家桶 React基础 React-Router(R 阅读详情

相关推荐

西电微机系统课程设计步进电机开环控制系统

** 微机系统与应用课程设计 课题二 步进电机开环控制系统设计** 一、程设计目的 掌握微机系统总线与各芯片管脚连接方法,提高接口扩展硬件电路的连接能力。 加深对 A/D 和并行接口芯片的工作方式和编程方法的理解。 搞懂步进电机的工作原理及控制方式,掌握开环控制系统的设计思路和实现方法。 二、课程设计的内容 手动调节电位器旋钮(0V~5V),通过 ADC0809 模拟输入水库水位 0 米~50...

qq_37015775的博客 4040

SpringAOP中的ProceedingJoinPoint使用,配合注解的方式(附带详细示例)

获取切入点方法的名字 getSignature());是获取到这样的信息 :修饰符+ 包名+组件名(类名) +方法名, 这里我只需要方法名 String methodName = joinPoint.getSignature().getName() 获取方法上的注解 方法1:xxxxxx是注解名字 Signature signature = joinPoint.getSignature(); MethodSignature methodSignature = (MethodSi.

weixin_48453772的博客 3万+

基于STM32的简易电压、频率、占空比测量仪

任务详解:我们需要实现三个功能: 第一个是测频率的功能,输入信号为频率为1kHz~10kHz的三种波形(方波、三角波、正弦波),这也是我们最常见的三种波形。幅度是不需要测量的,所以先不关心幅度。 第二个是电压报警功能,当输入信号的幅度超过15V时,我们需要报警(这里我用了一个红色LED当报警器,有条件的还可以加个蜂鸣器)并且把此时的信号幅度显示在OLED屏幕上。 第三个是通信方式的要求,需要有串口通信功能。 第四个是计算占空比的任务,这个任务的输入是幅度为1V~10V、频率为20Hz ~1kHz的方波,需要

weixin_43469377的博客 7254

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

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

Little_Arya的博客 1万+

从零开始搭建一个高性能电流镜:手把手教你设计Wide-Swing Cascode结构

本文详细解析了Wide-Swing Cascode电流镜的设计原理与实战流程。针对低压高性能模拟电路设计的核心挑战,文章手把手指导如何从理论分析、参数计算到仿真验证,搭建一个兼具高输出阻抗和低输出电压裕度的电流镜结构,并深入探讨了偏置电路生成、性能优化及版图匹配等关键要点。

weixin_29294975的博客 627

VSCode 中搭建 Python 开发环境

**验证安装**:打开终端(CMD/PowerShell/终端),输入 `python --version`(Windows)或 `python3 --version`(macOS/Linux),显示版本号即成功。- **下载地址**:[Python 官网](https://www.python.org/downloads/)(选择对应系统的最新稳定版,推荐 3.8+)- **调试**:通过 `launch.json` 配置,设置断点后按 `F5` 启动,使用 `F10/F11` 控制流程。

寒寒豆豆软件公司的博客 2540

springboot 集成 aop,ProceedingJoinPoint 对象详解

在Spring AOP中,ProceedingJoinPoint用于环绕通知(Around advice),通过它可以访问被通知方法的信息和参数。

m0_74295055的博客 1557

基于STC8A8K64S4A12的掉电唤醒定时器应用,极大降低产品功耗

通过合理的配置和编程,我们可以充分发挥单片机的功能,实现能效优化和电池寿命延长的目标。其中,掉电唤醒定时器是其一项重要功能,可以在系统处于睡眠状态时通过定时器的计时功能进行唤醒,从而实现对系统功耗的有效控制。使用STC8A8K64S4A12的掉电唤醒定时器功能,我们可以在不影响系统正常工作的情况下,大大降低产品的功耗。通过以上的代码,我们实现了一个简单的掉电唤醒定时器功能。当系统进入睡眠模式后,定时器开始计时,到达预设的唤醒时间后,定时器中断被触发,系统从睡眠模式唤醒,执行相应的操作。

CodeSageX的博客 1091

ProceedingJoinPoint获取当前方法

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34326179的博客 1964

git clone出现fatal: unable to access Failed to connect to github.com port 443: Timed out解决方案

本文主要介绍了git clone出现fatal: unable to access Failed to connect to github.com port 443: Timed out解决方案,希望能对使用git的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 23万+

VB.net:VB.net编程语言学习之ADO.net基本名称空间与类的简介、案例应用(实现与SQL数据库编程案例)之详细攻略

ADO.net有六个基础名称空间,除此之外,每个新的数据提供程序还可以有自己的名称空间,如Oracle。在.net中就提供了System.Data.OracleClient名称空间(用于Microsoft建立的Oracle数据库提供的程序)ADO.net体系结构的另一个核心元素是.Net数据提供程序(Data Provider),它的组件用于进行数据处理(和DataSet的数据访问功能相对应)。:是ADD.net核心名称空间,它包含所有数据提供程序使用的类,这些类表示表、列、行,还有DataSet类;

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 1737

Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); 这行代码的作用

对象,接下来可以做很多操作,比如获取这个方法上定义的注解,然后根据注解的配置执行特定的逻辑(如日志记录、权限检查等)。这行代码是 AspectJ 中常见的操作,用于从当前连接点获取被调用方法的。在上下文中,这行代码的目的是为了从当前的连接点中获取实际被调用的方法的。对象,从而可以进一步读取方法上的注解、名称等信息,以便实现切面逻辑。对象,以便进一步对方法进行操作或获取相关信息。在日志记录的切面中,我们使用上述代码来获取。对象中获取当前被调用的方法的。方法的名称和注解中的。,其中定义了一个方法。

m0_50272029的博客 920

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Spring AOP 总结二

AOP是一种编程思想,用于将程序中的横切关注点(如事务、日志)从业务逻辑代码中分离出来,以提高代码的可重用性和可维护性。Spring框架对其进行了实现。在Spring中AOP是通过代理模式实现的,即在运行时动态的生成一个代理,这个代理类会拦截目标对象的方法调用,并在方法执行前后添加响应的横切逻辑

java_lover20111106的博客 1200

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

STM32F407中文手册

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

详解Spring AOP篇二

详解Spring AOP的核心概念及两种实现方式。

. 5236

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Spring AOP实现浅析 二

​ 紧接上文《Spring AOP实现浅析 一》,本文继续介绍了Spring AOP实现的基础知识,了解了这些,将一步步带你明白Spring AOP实现的由来和历程。

weixin_45749194的博客 884

实验二 Spring AOP的使用

实验目的: 1.了解AOP的概念和使用 2.理解AOP中的切面以及通知 3.熟悉Spring中两种动态代理方式的区别 4.掌握基于代理类的AOP实现 实验内容: 实验任务1:创建项目,引入相关架包 在IDEA中创建一个名为spring02的Web项目,并将相关架包复制到lib目录,并发布到类路径下(具体操作方法在实验一中已经介绍,这里不详细说明,实验一地址:(29条消息) 实验一:Spriing IOC基本操作_老徐爱吃肉!的博客-优快云博客) 在这里我们需要将本次使用的两个架包也复制到l

qq_35965559的博客 1050

(二)Spring AOP

Spring AOP 是基于代理模式实现的,允许开发者将横切关注点(如日志、安全、事务等)提取成独立的切面,并且在不修改目标代码的情况下将其应用到目标方法上。Spring AOP 提供了灵活的通知类型(前置通知、后置通知、返回通知、异常通知、环绕通知)和强大的切入点表达式支持,使得开发者可以灵活地对目标对象进行增强。AOP 在事务管理、性能监控、日志记录等方面广泛应用,极大简化了开发。

qq_50847694的博客 1007

Spring AOP简介二

一、先了解AOP的相关术语:1.通知(Advice):   通知定义了切面是什么以及何时使用。描述了切面要完成的工作和何时需要执行这个工作。 2.切入点(Pointcut)   通知定义了切面要发生的“故事”和时间,那么切入点就定义了“故事”发生的地点,例如某个类或方法的名称,Spring中允许我们方便的用正则表达式来指定。(就是指定所有想启用通知的方法,也即指定所有想被通知拦截的方法) 3.连接点(Joinpoint):   程序能够应用通知的一个“时机”,这些“时机”就是连接点,例如方法被调用

rj042的专栏 818

Spring二:AOP和事务

Spring AOP和事务的介绍以及代码实现,文末附源码,供入门者下载学习

青衫忆笙的博客 3060

Spring AOP理解 二

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

第7维度 - 日常笔记 217

Spring之AOP源码(二)

书接上文 文章目录一、简介1. 前文回顾2. 知识点补充二、ProxyFactory源码分析1. ProxyFactory2. JdkDynamicAopProxy3. ObjenesisCglibAopProxy三、 Spring AOP源码分析 一、简介 1. 前文回顾 前面我们已经介绍了AOP的基本使用方法以及基本原理,但是还没有涉及源码层面,这篇文章就深度分析一下SpringAOP的底层源码。 2. 知识点补充 TargetSource 在我们日常的AOP中,被代理对象就是Bean对象,是由Be

qq_43456605的博客 1234

二、Spring5框架之AOP

AOP AOP(概念) (1)面向切面编程(方面),利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得 业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 (2)通俗描述:不通过修改源代码方式,在主干功能里面添加新功能 (3)使用例子说明 AOP AOP 底层使用动态代理 1、什么是 AOP (1)有两种情况动态代理 第一种 有接口情况,使用 JDK 动态代理 1、创建接口实现类代理对象,增强类的方法 第二种 没有接口情况,使用 CGLIB 动态代理 1、创建子类的代理对

qq_41231318的博客 291

SSM之Spring AOP【篇二】

JDK动态代理回顾 (1)动态代理,必须要有一个接口 (2)动态代理的三个参数 代理类,与被代理类 地位是一样的 所以,有相同的接口,相同的类加载器 (3)invoke方法 参1 一般不用,代理对象 参2 表示要增强哪个方法 AOP的术语 1、 目标类target:就是我们需要增强的那个类 LaoZong.class 2、 代理类proxy:就是自定义的代理的对象 $Proxy0.class 3、 连接点joinPoint:程序执行的某个特定位置,Spring仅支持方法的连接点 eat(),sleep(

syy567的博客 170

Spring AOP(二) Spring AOP 完整指南

本文详细介绍了Spring AOP的核心概念和使用方法。主要内容包括:1)@Around切入点表达式大全,列举了10种常用表达式及其语法;2)execution表达式详解,提供10个典型示例和通配符说明;3)组合表达式的逻辑运算符使用;4)五种通知类型的对比表格,包含执行时机和控制能力;5)各通知类型的代码实现示例;6)正常和异常情况下的执行顺序流程图;7)一个完整的日志切面实战案例。文章全面覆盖了Spring AOP的核心知识点,为开发者提供了实用的参考指南。

A-Itfuture的博客 512

Spring (二)—— Spring AOP

文章目录AOP概念AOP相关术语AOP的实现通过配置实现通过注解实现 AOP概念 AOP是面向切面,即扩展功能但是不修改源代码,AOP采取横向抽取机制,一般用于 性能监控、事务管理、安全检查、缓存; 这里先介绍一下纵向抽取机制: 我们一般添加功能是这样做的: public class User { public void add() { //添加用户的功能 ...

中都 579

二刷能变强系列-Spring AOP

一.问题引入 当我们需要升级业务修改逻辑代码时,我们要保证升级后的业务代码需要兼容以前的处理逻辑,也就是说再保留原有的功能逻辑的基础上,进行新的业务功能开发,这个时候就需要我们去修改当前的功能方法源码,增加新的逻辑代码,然后重新运行项目,这个时候就会出现: (1)假如我们有当前功能方法的源码,就需要阅读当前方法的源码,然后在增加自己的新的逻辑代码,并且修改后,需要将新的类文件替换旧的类文件,本身阅读代码效率较低。 (2)假如我们没有源码,那就无法直接修改源码,哪还怎么升级? 二.解决方法 方案一: 我们有一

WANG__Q的博客 214
上一篇: Spring(一)——Bean配置
下一篇: 面试常问的知识点总结(持续更新)
HY_Chan
博客等级 码龄10年 54粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值