Springboot-aop(一)

2023-11-05

引入依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
public interface MyCalculator {
    int add(int a, int b);
}
public class MyCalculatorImpl implements MyCalculator {
    public int add(int a, int b) {
        return a+b;
    }
}

基于xml 配置
aop.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
    <bean class="com.example.springbootaop.aspect.LogAspect" id="logAspect"/>
    <bean class="com.example.springbootaop.service.impl.MyCalculatorImpl" id="myCalculator"/>
    <aop:config>
        <aop:pointcut id="pc1" expression="execution(* com.example.springbootaop.service.*.*(..))"/>
        <aop:aspect ref="logAspect">
            <aop:before method="before" pointcut-ref="pc1"/>
            <aop:after method="after" pointcut-ref="pc1"/>
            <aop:after-returning method="returing" pointcut-ref="pc1" returning="r"/>
            <aop:after-throwing method="afterThrowing" pointcut-ref="pc1" throwing="e"/>
            <aop:around method="around" pointcut-ref="pc1"/>
        </aop:aspect>
    </aop:config>

</beans>

引入xml 配置

@Configuration
@ImportResource(locations = "classpath:aop.xml")
public class AopConfig {
}

启动项目

@SpringBootApplication
public class SpringbootAopApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(SpringbootAopApplication.class, args);
        MyCalculator myCalculator = (MyCalculator) context.getBean("myCalculator");
        myCalculator.add(1,3);
        
    }
}

基于注解配置

@Component
@Aspect
public class LogAspectAnnotation {

    @Pointcut("execution(* com.example.springbootaop.service.*.*(..))")
    public void pc(){

    }
    @Before("pc()")
    public void before(JoinPoint joinPoint) {
        Signature signature = joinPoint.getSignature();
        String name = signature.getName();
        System.out.println(name + "方法开始执行了...");
    }
    @After("pc()")
    public void after(JoinPoint joinPoint) {
        Signature signature = joinPoint.getSignature();
        String name = signature.getName();
        System.out.println(name + "方法执行结束了...");
    }
    @AfterReturning(value = "pc()",returning = "returnVal")
    public void returing(JoinPoint joinPoint,Object returnVal) {
        Signature signature = joinPoint.getSignature();
        String name = signature.getName();

    }
    @AfterThrowing(pointcut="pc()",throwing = "e")
    public void afterThrowing(JoinPoint joinPoint,Throwable e) {
        Signature signature = joinPoint.getSignature();
        String name = signature.getName();

    }
    @Around("pc()")
    public Object around(ProceedingJoinPoint pjp) {
        Object proceed = null;
        try {
            //这个相当于 method.invoke 方法,我们可以在这个方法的前后分别添加日志,就相当于是前置/后置通知
            System.out.println("around执行了1");
            proceed = pjp.proceed();
            System.out.println("around执行了2");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return proceed;
    }
}

启动项目和xml 有相同的效果

execution 表达式

学习Spring中的aop组装切面时遇到的execution表达式,下面是execution表达式的详解

切入点表达式:

整个表达式可以分为五个部分:

1、execution(): 表达式主体。

2、第一个*号:方法返回类型, *号表示所有的类型。

3、包名:表示需要拦截的包名。

4、第二个*号:表示类名,*号表示所有的类。

5、*(…):最后这个星号表示方法名,*号表示所有的方法,后面( )里面表示方法的参数,两个句点表示任何参数

execution(* 包名..(…))

规范写法:execution(* com.baizhi.service.UserServiceImpl.*(..))重点    最通用的        //执行接口下的所有接口方法
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Springboot-aop(一) 的相关文章

  • Grails 3.x bootRun 失败

    我正在尝试在 grails 3 1 11 中运行一个项目 但出现错误 失败 构建失败并出现异常 什么地方出了错 任务 bootRun 执行失败 进程 命令 C Program Files Java jdk1 8 0 111 bin java
  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 如何将 pfx 文件转换为 jks,然后通过使用 wsdl 生成的类来使用它来签署传出的肥皂请求

    我正在寻找一个代码示例 该示例演示如何使用 PFX 证书通过 SSL 访问安全 Web 服务 我有证书及其密码 我首先使用下面提到的命令创建一个 KeyStore 实例 keytool importkeystore destkeystore
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview

随机推荐

  • 工程实践---ZN法整定PID

    工程实践 ZN法整定PID 知乎 zhihu com
  • puppet—批量部署mysql5.7+httpd[包含启动]

    httpd install pp class httpd install package httpd name gt httpd ensure gt installed httpd service pp class httpd servic
  • 枚举类型的用法

    枚举类型的定义 枚举类型 enumeration 是C 中的一种派生数据类型 它是由用户定义的若干枚举常量的集合 定义格式 枚举类型的定义格式为 enum lt 类型名 gt lt 枚举常量表 gt 其中 关键字enum 指明其后的标识符是
  • 一些你需要掌握的 tsconfig.json 常用配置项

    大家好 我是前端西瓜哥 tsconfig json 是用来配置 TS 编译选项的 通常位于项目的根目录位置 我们可以用 ts 提供的 tsc 命令行工具 执行 tsc init tsc init Created a new tsconfig
  • cookie中存储json

    原文发布时间为 2009 12 14 来源于本人的百度文章 由搬家工具导入 http www denisdeng com p 563 最近的一个项目需要在cookie中存储json对象 查看网络资料 没有找到很好的例子 最终利用jquery
  • MySQL 表锁和行锁机制

    MySQL 表锁和行锁机制 行锁变表锁 是福还是坑 如果你不清楚MySQL加锁的原理 你会被它整的很惨 不知坑在何方 没事 我来给你们标记几个坑 遇到了可别乱踩 通过本章内容 带你学习MySQL的行锁 表锁 两种锁的优缺点 行锁变表锁的原因
  • 下载好看的壁纸四个网站就够了,尤其第二个,高清免费壁纸随你挑

    壁纸作为手机电脑的第一印象 我想一张好看的壁纸可以让你的心情变得十分愉悦 每个人喜欢的壁纸类型也是不同的 有些人喜欢科技 动漫 有些人却喜欢唯美 自然 但是好看的壁纸随处都有 但未必时自己想要的哪一款 所以今天我就来给大家推荐一些可以获得大
  • 【SpringBoot】Idea中web项目上传文件相对路径问题

    项目场景 springboot开发javaweb项目 在文件上传接口中 使用transferTo方法保存文件 当采用相对路径时保存会报错 问题描述 相对路径会报一个这样的错误 java io IOException java io File
  • 怎样系统的学习 AI 绘画?模型代码案例

    怎样系统的学习 AI 绘画 学习 AI 绘画需要从以下几个方面进行系统的学习 数学基础 学习 AI 绘画需要具备一定的数学基础 包括线性代数 概率论 微积分等 这些数学知识是深度学习模型的基础 有助于理解模型的数学原理和算法细节 编程基础
  • 抽签助手

    抽签助手实现 学习记录 今天突发奇想想要尝试一波抽签助手 具体代码如下 include
  • tomcat9调优2:Tomcat线程模型分析及其性能调优

    文章目录 Tomcat线程模型分析及其性能调优 Tomcat的IO模型 tomcat设计精髓点 Tomcat调优 Tomcat线程模型分析及其性能调优 Tomcat的IO模型 Tomcat 支持的多种 I O 模型和应用层协议 Tomcat
  • 基于计算机视觉实现自动报靶系统

    基于计算机视觉实现自动报靶系统 自动报靶系统是一种通过计算机视觉技术实现的靶标自动识别和跟踪的系统 该系统可以应用于一些需要高精度打靶的场合 如射击比赛 训练等 本文将介绍如何使用MATLAB实现一个基于计算机视觉的自动报靶系统 准备工作
  • LoadRunner录制图片验证码

    LoadRunner录制图片验证码 LoadRunner自身是无法捕获到图片验证码的 但是我们可以帮助LoadRunner来实现验证码的捕获 1 图片验证码 图片验证码的产生来自服务器端 由服务器生成随机数 然后写入到图片中 虽然LR可以录
  • 恢复图像-进行反卷积和非盲去卷积恢复原始图像

    这段 MATLAB 代码实现了对添加噪声的图像进行反卷积和非盲去卷积的处理 以恢复原始图像 读取失真图像 这里是标准的 img imread image jpg 转换图像的类型为double img im2double img 计算图像的大
  • 6、SpringBoot - 日志配置

    01 项目日志格式 Spring Boot 的默认日志输出类似于以下示例 2021 12 14 22 40 14 159 INFO 20132 main com kuangstudy SpringbootApplication Starte
  • Transfomer编码器中自注意力机制、前馈网络层、叠加和归一组件等讲解(图文解释)

    Transformer中的编码器不止一个 而是由一组N个编码器串联而成 一个编码的输出作为下一个编码器的输入 如下图所示 每一个编码器都从下方接收数据 再输出给上方 以此类推 原句中的特征会由最后一个编码器输出 编码器模块的主要功能就是提取
  • CCF CSP 认证 201612-2 工资计算 C语言

    include
  • 用抽象分层的方法分析Android的渲染和显示系统

    Hello World
  • Hinton关于RBM的代码注解之(二)backpropclassify.m

    源代码 http www cs toronto edu hinton MatlabForSciencePaper html 这个是关于RBM的微调步骤的代码 代价函数是交叉熵 Version 1 000 Code provided by R
  • Springboot-aop(一)

    引入依赖