【Sprin Aop注解式开发快速复习Aop】

news2024/11/15 11:06:38

Aop一般有以下常用注解:

@Aspect: 该注解是把此类声明为一个切面类。

@Before: 该注解是声明此方法为前置通知 (目标方法执行之前就会先执行被此注解标注的方法)

@After: 该注解是声明此方法为后置通知 (目标方法执行完之后就会执行被此注解标注的方法)

@AfterReturning: 该注解是声明此方法为返回通知 (目标方法正常执行返回后就会执行被此注解标注的方法)

@AfterThrowing: 该注解是声明此方法为异常通知 (目标方法在执行出现异常时就会执行被此注解标注的方法)

@Around: 该注解是环绕通知是动态的,可以在前后都设置执行

@PointCut: 该注解是声明一个公用的切入点表达式(通知行为的注解的都可以直接拿来复用)

通知类型包括:

● 前置通知:@Before 目标方法执行之前的通知
● 后置通知:@AfterReturning 目标方法执行之后的通知
● 环绕通知:@Around 目标方法之前添加通知,同时目标方法执行之后添加通知。
● 异常通知:@AfterThrowing 发生异常之后执行的通知
● 最终通知:@After 放在finally语句块中的通知

注解式开发

接下来,编写程序来测试这几个通知的执行顺序:
第一步:创建切面类:

//切面=通知加切点
//这里通知Advice以方法的形式出现,因为方法中可以写代码
//例如@Before注解标注的方法就是一个前置通知。括号里面是切点表达式 // 格式是@Before(“execution(修饰符 返回值类型 全限定类名 方法名(形式参数列表 )) 异常”)

不会切点表达式的或者想了解详情的请点击下面博主的另一篇查看详情哦!
spring Aop之切点表达式

package com.powernode.spring6.sevice;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @author 阿离小稚
 * @date 2023/12/13/22:10
 */
@Component
@Aspect //切面是需要这个注解标注的。
public class LogAspect {//切面类
    //切面=通知加切点
    //这里通知Advice以方法的形式出现,因为方法中可以写代码
    //@Before注解标注的方法就是一个前置通知。里面是切点表达式
//    @Before("execution(修饰符 返回值类型 全限定类名 方法名(形式参数列表 )) 异常")
    @Before("execution( * com.powernode.spring6.sevice..*(..))")
    public void beforeAdvice(){
        System.out.println("前置通知。。。");
    }

    //后置通知
    @AfterReturning("execution( * com.powernode.spring6.sevice..generate(..))")
    public void afterReturningAdvice(){
        System.out.println("后置通知。。。");
    }
    //环绕通知(环绕是最大的通知,在前置通知之前,在后置通知之后)
    @Around("execution( * com.powernode.spring6.sevice..*(..))")
    public void aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("前环绕haha");
        //执行目标
        joinPoint.proceed();
        System.out.println("后环绕haha");
    }
    //异常通知
    @AfterThrowing("execution( * com.powernode.spring6.sevice..*(..))")
    public void afterThrowingAdvice(){
        System.out.println("异常通知ooo");
    }
    //最终通知(finally语句块中的通知)
    @After("execution( * com.powernode.spring6.sevice..*(..))")
    public void afeterAdvice(){
        System.out.println("最终通知!!");
    }

}

第二步:创建目标类和目标方法:

package com.powernode.spring6.service;

import org.springframework.stereotype.Component;

// 目标类
@Component
public class OrderService {
    // 目标方法
    public void generate(){
        System.out.println("订单已生成!");
    }
}

第三步:创建测试程序:

package com.powernode.spring6.test;

import com.powernode.spring6.service.OrderService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AOPTest {
    @Test
    public void testAOP(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        OrderService orderService = applicationContext.getBean("orderService", OrderService.class);
        orderService.generate();
    }
}

第四步:运行测试程序查看运行结果:
在这里插入图片描述

通过上面的执行结果就可以判断他们的执行顺序了,这里不再赘述。
结果中没有异常通知,这是因为目标程序执行过程中没有发生异常。我们尝试让目标方法发生异常:

package com.powernode.spring6.service;

import org.springframework.stereotype.Component;

// 目标类
@Component
public class OrderService {
    // 目标方法
    public void generate(){
        System.out.println("订单已生成!");
        if (1 == 1) {
            throw new RuntimeException("运行时异常...");
        }
    }
}

再次执行测试程序,结果如下:
在这里插入图片描述

通过测试得知,当发生异常之后,最终通知也会执行,因为最终通知@After会出现在finally语句块中。
出现异常之后,后置通知和环绕通知的结束部分不会执行。

好了以上就是各种通知类型的演示(Aop注解开发)。想要了解切面的先后顺序的请看小编的下一篇博客
spring Aop基于注解之切面的先后顺序

@PointCut注解的使用

切点表达式没有得到复用我们可以用以下方法:

public class LogAspect {//切面类
    
    @Pointcut("execution( * com.powernode.spring6.sevice..*(..))")
    public void 通用切点(){
        //zhe个方法只是个标记,方法名随意,方法体中也不需要写任何代码
    }
    //切面=通知加切点
    //这里通知Advice以方法的形式出现,因为方法中可以写代码
    //@Before注解标注的方法就是一个前置通知。里面是切点表达式
//    @Before("execution(修饰符 返回值类型 全限定类名 方法名(形式参数列表 )) 异常")
    @Before("通用切点()")
    public void beforeAdvice(){
        System.out.println("前置通知。。。");
    }

如图所示
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1312966.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Axure元件库的介绍以及个人简介和登录界面案例展示

目录 一. 元件介绍 二. 基本元件的使用 2.1 形状元件 2.2 图片元件 2.3 占位符 2.4 文本 2.5 线段元件 2.6 热区文件 三. 表单元件的使用 3.1 文本框 3.2 文本域 3.3 下拉列表 3.4 列表框 3.5 复选框 3.6 单选按钮 四. 菜单与表格元件的使用 4.1 树 4.2 表格…

基于单片机智能家具无线遥控控制系统设计

**单片机设计介绍,基于单片机智能家具无线遥控控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的智能家具无线遥控控制系统设计可以实现对家具(如灯具、窗帘、空调等)的…

JOSEF 组合中间继电器 RXMM1-RK214003 DC220V 不带底座

系列型号 RXMM1 RK 214 002组合中间继电器;RXMM1 RK 214 003组合中间继电器; RXMM1 RK 214 004组合中间继电器;RXMM1 RK 214 005组合中间继电器; RXMM1 RK 214 006组合中间继电器; 1 用途 RXMM1系列组合中间继电器用于电力系统二次回路及…

手把手教你写 Compose 动画 -- 组件大小变化 API:animateContentSize

Jetpack Compose 提供了一系列功能强大且可扩展的 API,可用于在应用界面中轻松实现各种动画效果。这一系列文章会逐个介绍所有的动画 API,通过最直观的 Demo 示例,手把手教你怎么写动画以及带你了解动画背后的原理。 📑 手把手教你…

【Python】解读a+=b 和 a=a+b是否一样?看完恍然大悟!

文章目录 前言一、可变对象和不可变对象总结 前言 在Python中,对于可变和不可变对象的行为差异是一个重要概念,特别是在涉及到和操作时。理解这一点对于编写高效且无误的代码至关重要。 一、可变对象和不可变对象 首先,让我们谈谈可变和不可…

Webstorm使用方法

标题一 安装步骤 1.打开JetBrans官方网站(https://www.jetbrains.com/webstorm)并下载适用于您操作系统的WebStorm安装程序 2.运行下载的安装程序 3.再安装程序中选择您想要安装WebStorm的位置,并接收软件许可协议 4.接下来您可以选择要安…

python中else的细节

if-else 首先我们都知道else可以和if共同使用,如果if条件没有执行,就会去执行else语句 a100 if a100:print("if 语句执行了") else:print("else语句执行了") a10 if a100:print("if 语句执行了") else:print("else…

计算机组成原理---浮点数的加减运算

这是本人的做法,不喜勿喷!

mac 安装nvm以及切换node版本详细步骤

1、nvm介绍(node版本管理工具) nvm 可以让你通过命令行快速安装和使用不同版本的node 有时候项目太老,node版本太高,执行npm install命令会报错,可以借助nvm切换低版本的node。 2、安装nvm 在终端执行安装命令 curl -o- https://raw.gith…

Linux route命令详解

1、介绍 route命令用于显示和操作IP路由表,它允许用户查看当前系统的路由信息,添加新的路由、删除已有的路由等。 2、命令 2.1 命令选项 -n, --numeric:不解析主机名,直接显示IP地址。使用这个选项可以加快显示速度&#xff0…

蓝凌EIS智慧协同平台 SQL注入漏洞复现

0x01 产品简介 蓝凌EIS智慧协同平台是一款专为企业提供高效协同办公和团队合作的产品。该平台集成了各种协同工具和功能,旨在提升企业内部沟通、协作和信息共享的效率。 0x02 漏洞概述 由于蓝凌EIS智慧协同平台 UniformEntry.asp接口处未对用户输入的SQL语句进行…

DeepStream--调试Gstreamer

DeepStream是基于Gstreamer开发的。有时候需要在Gstreamer加日志,比如想在rtpjitterbuffer里加日志。 首先,执行gst-inspect-1.0 rtpjitterbuffer命令。 从结果中可以看到,rtpjitterbuffer插件的源码是gst-plugins-good,版本是1…

广州华锐互动:VR煤矿安全操作规程实训提升矿工安全意识与技能

随着科技的不断发展,虚拟现实(VR)技术已经逐渐渗透到各个领域,为人们的生活带来了极大的便利。在煤矿行业,VR技术的应用也日益受到重视,尤其是在煤矿安全检查方面。为了提高矿工的安全意识和技能&#xff0…

springboot自定义starter步骤

引入相关依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional> </dependency><dependency><groupId>org.pro…

(基础篇)通过node增删改查连接mysql数据库

一定要会最基础的sql建表一定要会最基础的sql建表一定要会最基础的sql建表 首先说一下准备工作 一、准备工具 1.mysql数据库Navicat可视化工具&#xff08;数据库表单已经建好&#xff09; 我这里用的小皮工具直接开启的本地mysql 2.vscode (不用说基本上都有) 3.node.js …

C语言学习----指针和数组

&#x1f308;这篇blog记录一下指针学习~ 主要是关于指针和数组之间的关系&#xff0c;还有指针的使用等~ &#x1f34e;指针变量是一个变量 其本身也有一个地址 也需要存放&#xff0c;就和int char等类型一样的&#xff0c;也需要有一个地址来存放它 &#x1f34c;而指针变量…

自动生成采集规则的网页采集器

传统的采集器配置采集规则&#xff0c;需要查看网页源码&#xff0c;这要求用户具备一定的编程知识&#xff0c;增加了使用难度&#xff0c;也让很多不懂代码的用户无法采集数据了。 然而&#xff0c;现在有一种智能网页采集器工具&#xff1a;简数采集器&#xff0c;无需懂代…

Mapreduce小试牛刀(2)--java api

1.同hdfs 的java api,我们首先要在IDE中建立一个maven项目 pom.xml中配置如下&#xff1a; <dependencies><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-mapreduce-client-common</artifactId><version>3.…

TS系列-keyof的妙用

案例1 1、如果&#xff0c;有一个接口&#xff0c;某个变量的类型&#xff0c;是这个接口的 key &#xff1f; keyof 后面可以跟 一个对象类型或者一个接口类型keyof 是把后面 对象或者接口 的 键 都提取出来&#xff0c;组成一个联合类型 interface IStudentAttr {name: stri…

低代码开发如何快速构建AI应用

随着人工智能&#xff08;AI&#xff09;的快速发展&#xff0c;越来越多的企业和开发者开始意识到AI在业务和应用中的重要性。然而&#xff0c;AI应用的开发通常被认为是复杂和耗时的过程&#xff0c;需要大量的编码和数据科学知识。为了解决这个问题&#xff0c;低代码开发平…