【JavaSpring】Aop的通知类型,获取数据

news2025/4/6 14:17:16

AOP 通知描述了抽取的共性功能,根据共性功能抽取的位置不同,最终运行代码时要将其加入到合理的位置

前置通知

@Pointcut("execution(void org.example.dao.BookDao.update())")
    private void pt() {
    }

    @Before("pt()")
    public void before() {
        System.out.println("before advice");
    }

后置通知

@Pointcut("execution(void org.example.dao.BookDao.update())")
    private void pt() {
    }

@After("pt()")
    public void after() {
        System.out.println("after advice");
    }

环绕通知(获取异常和返回值)

无对原始操作的调用

显然原始方法不执行了

 @Pointcut("execution(void org.example.dao.BookDao.update())")
    private void pt() {
    }
 
@Around("pt()")
    public void around() {
        System.out.println("around before advice");
        System.out.println("around after advice");
    }

 

加上对原始操作的调用

无返回值

 @Pointcut("execution(void org.example.dao.BookDao.update())")
    private void pt() {
    }
 
@Around("pt()")
    public void around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("around before advice");
        pjp.proceed();
        System.out.println("around after advice");
    }

如果有返回值

@Around("pt()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("around before advice");
        Object obj=pjp.proceed();
        System.out.println("around after advice");
        return obj;
    }

返回后通知(获取返回值)

成功运行后执行

  @Pointcut("execution(void org.example.dao.BookDao.update())")
    private void pt() {
    }

@AfterReturning("pt()")
    public void afterReturning() {
        System.out.println("afterReturning advice");
    }

和后置通知的区别

如果抛出异常,AfterReturning不运行,但After正常运行 

抛出异常后通知(获取异常)

@Pointcut("execution(void org.example.dao.BookDao.update())")
    private void pt() {
    }
 
@AfterThrowing("pt()")
    public void afterThrowing() {
        System.out.println("afterThrowing advice");
    }

测试(通知类型,如果想看看效果,直接复制) 

package org.example.dao.impl;

import org.example.dao.BookDao;
import org.springframework.stereotype.Repository;

@Repository
public class BookDaoImpl implements BookDao {

    public void save() {
        System.out.println("book dao save");
    }


    public void update() {
        System.out.println("book dao update");
    }

    public void delete() {
        System.out.println("book dao delete");
    }

    public int select() {
        System.out.println("book dao select");
        return 100;
    }
}
package org.example.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@ComponentScan("org.example")
@EnableAspectJAutoProxy//有用注解开发的AOP
public class SpringConfig {
}
package org.example.aop;

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

@Component
@Aspect//当作Aop处理
public class MyAdvice {
    @Pointcut("execution(void org.example.dao.BookDao.update())")
    private void pt() {
    }

    @Before("pt()")
    public void before() {
        System.out.println("before advice");
    }

    @After("pt()")
    public void after() {
        System.out.println("after advice");
    }

    @Around("pt()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("around before advice");
        Object obj = pjp.proceed();
        System.out.println("around after advice");
        return obj;
    }

    @AfterReturning("pt()")
    public void afterReturning() {
        System.out.println("afterReturning advice");
    }

    @AfterThrowing("pt()")
    public void afterThrowing() {
        System.out.println("afterThrowing advice");
    }
}
package org.example.dao;

public interface BookDao {
    void save();
    void update();
    int select();
}
package org.example;

import org.example.config.SpringConfig;
import org.example.dao.BookDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        ApplicationContext ctx=new AnnotationConfigApplicationContext(SpringConfig.class);
        BookDao bookDao=ctx.getBean(BookDao.class);
        bookDao.update();
    }
}

测试(获取参数,JoinPoint必须是第一位)

package org.example.aop;

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

import java.util.Arrays;

@Component
@Aspect//当作Aop处理
public class MyAdvice {
    @Pointcut("execution(* org.example.dao.BookDao.findName(..))")
    private void pt() {
    }

    @Before("pt()")
    public void before(JoinPoint jp) {
        Object[] args = jp.getArgs();
        System.out.println("before advice:" + Arrays.toString(args));
    }

    @After("pt()")
    public void after(JoinPoint jp) {
        Object[] args = jp.getArgs();
        System.out.println("after advice:" + Arrays.toString(args));
    }

    @Around("pt()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("around before advice");
        Object obj = pjp.proceed();
        Object[] args = pjp.getArgs();
        System.out.println("around after advice:" + Arrays.toString(args));
        return obj;
    }

    @AfterReturning(value = "pt()", returning = "res")
    public void afterReturning(Object res) {
        System.out.println("afterReturning advice:" + res);
    }

    @AfterThrowing(value = "pt()", throwing = "t")
    public void afterThrowing(Throwable t) {
        System.out.println("afterThrowing advice"+t);
    }
}
package org.example.dao;

public interface BookDao {

    String findName(int id);

}

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

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

相关文章

数据结构与算法:排序算法(2)

目录 堆排序 使用步骤 代码实现 计数排序 适用范围 过程 代码实现 排序优化 桶排序 工作原理 代码实现 堆排序 二叉堆的特性: 1. 最大堆的堆顶是整个堆中的最大元素 2. 最小堆的堆顶是整个堆中的最小元素 以最大堆为例,如果删除一个最大堆的…

基于Java开发的数字化询价招标采购系统(SRM系统源码)

在如今商业环境中,企业的采购流程变得越来越重要。传统的采购方式可能存在诸多弊端,例如效率低下、信息不透明、易滋生腐败等。为了解决这些问题,许多企业开始转向SRM(供应商关系管理)系统。本文将详细介绍SRM数字询价…

js表单autocomplete=‘off‘失效问题

众所周知。。。。autocomplete是Html5中的新属性,有‘off’,on’两个属性。作用是点击输入框时,会打开或者关闭提示信息。 部分浏览器也会出现失效的情况(emmmm…,毕竟是html5新增的,有点bug也正常哈)。 …

初识Java 10-1 集合

目录 泛型和类型安全的集合 基本概念 添加一组元素 打印集合 List Iterator(迭代器) 本笔记参考自: 《On Java 中文版》 在进行程序设计时我们会发现,程序总是会根据某些在运行时才能知道的条件来创建新的对象。这意味着&am…

Vue3 - 实现动态获取菜单路由和按钮权限控制指令

GitHub Demo 地址 在线预览 前言 关于动态获取路由已在这里给出方案 Vue - vue-admin-template模板项目改造:动态获取菜单路由 这里是在此基础上升级成vue3和ts,数据和网络请求是通过mock实现的 具体代码请看demo!!! 本地权限控制,具体是通过…

关于若依(ruoyi)前端,f12跟踪失效的问题处理

1、根据作者反馈,使用了vite-plugin-vue-setup-extend该插件; 2、参考作者指导,我采用了去掉这个插件的方法; 具体操作: (1)找到package.json,去掉该插件; (2&#xff…

新的小伙伴加入,开始系统更新分享了

近几个月一直有一个好消息未跟大家分享,就是我们有新的小伙伴加入了,帅就不必说了,关键是对电控的理解那可不是一般的强,工程经验丰富,学术能力也是一等一的。我们有幸在一个公司工作,跟着一个企业导师学习…

10个值得关注的学习网站,知乎超30万人收藏,什么资源都可找到!

hi,大家好我是技术苟,每周准时上线为你带来实用黑科技!由于公众号改版,现在的公众号消息已经不再按照时间顺序排送了。因此小伙伴们就很容易错过精彩内容。喜欢黑科技的小伙伴,可以将黑科技百科公众号设为标星&#xf…

Webstorm怎么导入插件

Webstorm怎么导入插件: 1.点击“File”,选择“Settings” 2.选择“Plugins” 3.如下图所示继续操作 4.选择想要导入的插件

【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

自动化测试:yaml结合ddt实现数据驱动!

在pythonunittestseleniumddt的框架中,数据驱动常见有以下几种方式实现: Csv/txtExcelYAML 本文主要给大家介绍测试数据存储在YAML文件中的使用场景。首先先来简单介绍一下YAML。 1. 什么是YAML 一种标记语言类似YAML,它实质上是一种通用…

方案:浅析AI视频分析与视频监控技术的工厂车间智能化监管方案

一、方案背景 工厂生产车间一般是从原材料到成品的流水作业,有大量器械和物料。为保障车间财产安全并提高生产效率,需要进行全面的监管。在生产制造流水线的关键工序中,不仅有作业过程监管需求,同时,也存在生产发生异…

全网最全知识图谱讲解!

什么是知识图谱 知识图谱标准化白皮书定义:知识图谱(Knowledge Graph)以结构化的形式描述客观世界中概念、实体及其关系,将互联网的信息表达成更接近人类认知世界的形式,提供了一种更好地组织、管理和理解互联网海量信…

Jmeter怎么实现接口关联?

用于接口测试时,后一个接口经常需要用到前一次接口返回的结果,应该如何获取前一次请求的结果值,应用于后一个接口呢,拿一个登录的例子来说明如何获取。 1、打开jmeter,新建一个测试计划,在测试计划里新建一…

分享基于SringBoot足球训练俱乐部系统Python训练打卡系统(源码+调试+lw)

💕💕作者:计算机源码社 💕💕个人简介:本人七年开发经验,擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等,大家有这一块的问题可以一起交流! 💕&…

SMS--短信服务

1 短信服务介绍 短信服务(Short Message Service)是阿里云为用户提供的一种通信服务的能力。 2 短信服务使用 接下来,我们使用短信验证码功能来演示短信服务的使用。流程如下: 2.1 准备工作 2.1.1 实名认证 https://help.aliyun.com/document_detail…

智能箱式浪涌保护器综合行业解决方案

智能箱式浪涌保护器是一种集成了多种功能的浪涌保护装置,它可以对电力系统、通信系统、计算机系统、工业控制系统等设备提供有效的防雷和过电压保护。本文将详细介绍智能箱式浪涌保护器的作用和原理,以及在不同行业中的应用方案,并参考相关的…

【Hash表】两数之和-力扣 1 题

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

【国产32位mcu】电动车控制芯片CS32F031C8T6的应用

近年来,随着“新国标”的落地,双轮电动车在智能化、强性能、安全性等方面不断演进,带动了新一轮的换车高峰。电动车控制器作为双轮电动车的核心部件,迎来新的增长。 芯海科技32位MCU CS32F031C8T6,作为电动车控制器的…

多因素身份验证MFA功能

随着信息技术的不断进步,网络威胁也随之不断升级和演化。为了保护敏感数据和网络资源,企业和组织需要采取更多的安全措施强化信息安全。多因素身份验证(MFA)已经成为了现代安全战略的核心组成部分之一。 在这篇文章中&#xff0…