一文拿捏Spring之AOP

news2024/11/20 3:35:37

Spring

1.Spring的理解

1.狭义上

指SpringFramework,特别的控制反转、依赖注入、面向切面、等特性

2.广义上

Spring家族的一系列产品,像SpringMVC、SpringBoot、SpringCloud等

2.aop

🌟面试题(aop):

简单介绍一下AOP?

  1. aop就是面向切面编程,是一种编程思想,是对oop的延续

  2. 可以使我们在不改变源码的情况下,对类中的方法功能进行增强

  3. 可以使增强的代码具备复用性、提高开发效率、提高代码的维护性

1.相关属性

  1. 目标类:被增强的方法所在的类

  2. 连接点:目标类中所有的方法

  3. 切入点:目标类中被增强的方法

  4. 通知:增强的功能

    1. 前置通知 @Before :执行目标方法前要增强的功能

    2. 执行目标方法

      proceed = proceedingJoinPoint.proceed();
    3. 返回后通知 @AfterReturning:目标方法正确执行后要增强的功能

    4. 异常通知 @AfterThrowing:目标方法执行出错要增强的功能

    5. ⭐环绕通知 @Around:可以实现其他通知的功能

    6. 后置通知 @After:最后执行的通知

  5. 切面:@Aspect:通知+切入点

2.AOP底层原理

1.动态代理

1.JDK的动态代理

要求被代理的类实现接口

2.cglib的动态代理

被代理的类可以不实现接口

3.定义切入点的方式

1.使用切入点表达式
@Component
@Aspect
@Slf4j
public class AopAspect1 {
​
    @Before("execution(public * com.atguigu.gmall.item.service..*.*(..))")
    public void before() {      // 前置通知
        log.info("AopAspect1.....before....方法执行了");
    }
​
    @After("execution(public * com.atguigu.gmall.item.service..*.*(..))")
    public void after() {       // 后置通知
        log.info("AopAspect1.....after....方法执行了");
    }
​
    @AfterReturning("execution(public * com.atguigu.gmall.item.service..*.*(..))")
    public void afterReturning() { // 返回后通知,只有方法正常返回了,那么此时才会执行该方法
        log.info("AopAspect1.....afterReturning....方法执行了");
    }
​
    @AfterThrowing("execution(public * com.atguigu.gmall.item.service..*.*(..))")
    public void afterThrowing() {   // 异常后通知,只有方法产生异常以后,才会执行该方法
        log.info("AopAspect1.....afterThrowing....方法执行了");
    }
​
    /**
     * 一个环绕通知可以实现其他的四种通知的全部功能
     * @param proceedingJoinPoint
     * @return
     * @throws Throwable
     */
    @Around("execution(public * com.atguigu.gmall.item.service..*.*(..))")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {      // 环绕通知
        log.info("AopAspect1.....around..前..方法执行了");
        Object proceed = null ;
        try {
            proceed = proceedingJoinPoint.proceed();
            log.info("AopAspect1.....around..后..方法执行了");
        }catch (Exception e) {
            e.printStackTrace();  // 异常后通知
        } finally {
            // 最终通知
        }
        System.out.println(proceed);
        return proceed ;
    }
}
2.使用自定义注解
// com.atguigu.gmall.item.anno,自定义注解
@Target(value = ElementType.METHOD)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface GmallCache {
    
}
​
// 在AopService切入点方法上添加自定义注解
@GmallCache
@Override
public SkuInfo findSkuById(long skuId) {
    log.info("AopServiceImpl....findSkuById方法执行了.....");
    SkuInfo skuInfo = new SkuInfo() ;
    skuInfo.setSkuName("小米 CC9 PLUS 手机 美颜自拍 游戏手机 仙女渐变色(美图定制版) 4G全网通 6GB+128GB");
    return skuInfo;
}
​
// 定义基于注解进行拦截器的环绕通知
@Component
@Aspect
@Slf4j
public class AopAspect2 {
​
    @Around("@annotation(gmallCache)")
    public Object around(ProceedingJoinPoint proceedingJoinPoint , GmallCache gmallCache) throws Throwable {      // 环绕通知
        log.info("AopAspect2.....around..前..方法执行了");
        Object proceed = null ;
        try {
            proceed = proceedingJoinPoint.proceed();
            log.info("AopAspect2.....around..后..方法执行了");
        }catch (Exception e) {
            e.printStackTrace();  // 异常后通知
        } finally {
            // 最终通知
        }
        System.out.println(proceed);
        return proceed ;
    }
}

4.多切面相关

🌟面试题(事务失效):

在使用多切面的情况下,自定义切面类捕捉到了目标方法的异常,但是因为没有吧异常抛出,导致事务切面类获取不到异常信息,事务切面类认为业务方法正常执行了,事务就不会进行回滚,从而导致了事务失效

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

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

相关文章

【userfaultfd】2021强网杯notebook

程序分析 老规矩,看下启动脚本 开启了 smep、smap、kaslr 保护,当然 kvm64 默认开启 kpti 保护 文件系统初始化脚本 #!/bin/sh /bin/mount -t devtmpfs devtmpfs /dev chown root:tty /dev/console chown root:tty /dev/ptmx chown root:tty /dev/tty…

SAAJ:SOAP with Attachments API for Java

介绍 支持带附件的SOAP消息Java接口(SAAJ:SOAP with Attachments API for Java),定义了一套API,使开发者可以产生、消费遵从SOAP 1.1, SOAP 1.2, 和SOAP Attachments Feature的消息。 2019年SAAJ更改为新的名字&…

MIP精确算法的关键——确定界

目录 1.界是什么? 2. 如何更新上下界 2.1 以分支定界为框架的一系列算法 2.2 benders分解 MIP精确算法包含,分支定界、分支切割、分支定价还有benders分解等等。前者是以分支定界为框架的一类算法;后者是以分解为框架的一类算法。甚至还包…

Springboot学习笔记——1

Springboot学习笔记——1 一、快速上手Springboot1.1、Springboot入门程序开发1.1.1、IDEA创建Springboot项目1.1.2、官网创建Springboot项目1.1.3、阿里云创建Springboot项目1.1.4、手工制作Springboot项目 1.2、隐藏文件或文件夹1.3、入门案例解析1.3.1、parent1.3.2、starte…

嵌入式软件架构基础设施设计方法

大家好,今天分享一篇嵌入式软件架构设计相关的文章。 软件架构这东西,众说纷纭,各有观点。在我看来,软件架构是软件系统的基本结构,包含其组件、组件之间的关系、组件设计与演进的规则,以及体现这些规则的基…

Nginx高级 第一部分:扩容

Nginx高级 第一部分:扩容 通过扩容提升整体吞吐量 1.单机垂直扩容:硬件资源增加 云服务资源增加 整机:IBM、浪潮、DELL、HP等 CPU/主板:更新到主流 网卡:10G/40G网卡 磁盘:SAS(SCSI) HDD(机械…

【C/C++笔试练习】——常量指针和指针常量、结构体内存分配、统计输入的字母个数、排序子序列、倒置字符串

文章目录 C/C笔试练习1.常量指针和指针常量(1)常量指针和指针常量的定义(2)判别常量指针和指针常量(3)常量指针和指针常量的特性 2.结构体内存分配(4)计算结构体大小(5&a…

【计算机】CPU,芯片以及操作系统概述

1.CPU 什么是CPU? CPU(Central Processing Unit)是计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元,相当于系统的“大脑”。 CPU的工作流程? CPU 的工作流程分为以下 5 个阶段:取指令…

C++ -- 学习系列 关联式容器 set 与 map

一 关联式容器是什么? c 中有两种容器类型:关联式容器与序列式容器(顺序容器) 关联式中的容器是按照关键字来存储与访问的,序列式容器(顺序容器)则是元素在容器中的相对位置来存储与访问的。…

C++标准模板(STL)- 类型支持 ()

对象、引用、函数&#xff08;包括函数模板特化&#xff09;和表达式具有称为类型的性质&#xff0c;它限制了对这些实体所容许的操作&#xff0c;并给原本寻常的位序列提供了语义含义。 附加性基本类型及宏 实现定义的空指针常量 NULL 定义于头文件 <clocale> 定义于…

2.类与对象 拜访对象村

2.1 椅子大战 在图形接口画出正方形、圆形与三角形。当用户选点图形时&#xff0c;图形需要顺时针转360并依据形状的不同播放播放不同的AIF文件。胜者可以坐上名贵宝椅。 面向过程&#xff1a; rotate(shapeNum) {//旋转360 } playSound(shapeNum) {//查询播放哪个AIF文件//播…

嵌入式Linux应用开发-驱动大全-同步与互斥②

嵌入式Linux应用开发-驱动大全-同步与互斥② 第一章 同步与互斥②1.3 原子操作的实现原理与使用1.3.1 原子变量的内核操作函数1.3.2 原子变量的内核实现1.3.2.1 ATOMIC_OP在 UP系统中的实现1.3.2.2 ATOMIC_OP在 SMP系统中的实现 1.3.3 原子变量使用案例1.3.4 原子位介绍1.3.4.1…

pyqt5使用经验总结

pyqt5环境配置注意&#xff1a; 安装pyqt5 pip install PyQt5 pyqt5-tools 环境变量-创建变量名&#xff1a; 健名&#xff1a;QT_QPA_PLATFORM_PLUGIN_PATH 值为&#xff1a;Lib\site-packages\PyQt5\Qt\plugins pyqt5经验2&#xff1a; 使用designer.exe进行设计&#xff1…

Maven - MacOS 快速安装

配置信息 Maven 版本&#xff1a;3.6.3Maven 地址&#xff1a;Index of /dist/maven/maven-3IDEA&#xff1a;2023 Tips&#xff1a;Maven 版本最好不要超过 3.8.0&#xff0c;最新版 Maven 会不兼容一些配置信息。上面的 Maven 地址里可以选择自己想下载的版本&#xff08;这…

【源码】hamcrest 源码阅读及空对象模式、模板方法模式的应用

文章目录 前言1. 类图概览2. 源码阅读2.1 抽象类 BaseMatcher2.1 接口 Description提炼模式&#xff1a;空对象模式 2. 接口 Description 与 SelfDescribing 配合使用提炼模式 模板方法 后记 前言 hamcrest &#xff0c;一个被多个测试框架依赖的包。听说 hamcrest 的源码质量…

【maven】idea中基于maven-webapp骨架创建的web.xml问题

IDEA中基于maven-webapp骨架创建的web工程&#xff0c;默认的web.xml是这样的。 <!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name…

go语法入门2

字符串 使用双引号或反引号引起来的任意个字符。它是字面常量。 func main() {var a "abc\n测试" // \n换行fmt.Println(a) } abc 测试func main() {var a "abc\n\t测试" \\换行后在tabfmt.Println(a) } abc测试func main() {var a abc测试 …

CppCheck静态代码检查工具教程【Windows和Linux端】

目录 1、背景 2、特性介绍 2.1、检查结果 2.2、检查范围 2.3、支持的检查规则&#xff08;列举一些&#xff09;: 2.4、自定义规则 3、linux 端 4、windows 端 1、背景 最近调研了几款 c/c 代码静态检查工具&#xff0c;包括 cppcheck、cpplint、cppdepend、splint、ts…

cmip6数据处理之降尺度

专题一 CMIP6中的模式比较计划 1.1 GCM介绍全球气候模型&#xff08;Global Climate Model, GCM&#xff09;&#xff0c;也被称为全球环流模型或全球大气模型&#xff0c;是一种用于模拟地球的气候系统的数值模型。这种模型使用一系列的数学公式来描述气候系统的主要组成部分…