Spring——AOP是什么?如何使用?

news2024/11/19 5:54:48

一、什么是AOP?

在不修改源代码的情况下 增加功能

二、底层是什么?

动态代理

aop是IOC的一个扩展功能,现有IOC,再有AOP,只是在IOC的整个流程中新增的一个扩展点而已:BeanPostProcessor

bean的创建过程中有一个步骤可以对bean进行扩展实现,AOP本身就是一个扩展功能,所以BeanPostProcessor的后置处理方法来进行实现

三、术语

①、连接点

在一个类里面哪些方法可以被增强,这些方法就称为连接点

②、切入点

实际被真正增强的方法,称为切入点

③、通知(增强)

实际增强的逻辑部分称为通知(增强)

通知有多种类型

  • 前置通知

  • 后置通知

  • 环绕通知

  • 异常通知

  • 最终通知

④、切面

把通知应用到切入点的过程


四、AOP操作

Spring框架一般都是基于AspectJ实现AOP操作

什么是AspectJ?

不是Spring组成部分,独立AOP框架,一般把AspectJ和Spring框架一起使用,进行AOP操作

基于AspectJ实现AOP操作

  1. 基于xml配置方式

  1. 基于注解方式

一、注解方式

引入AOP依赖

开启注解扫描

开启Aspect生成代理对象

User类

package com.atguigu.spring5.AOP;

import org.springframework.stereotype.Component;

/**
 * @BelongsProject: 02-Spring
 * @BelongsPackage: com.atguigu.spring5.AOP
 * @Author: dengLiMei
 * @CreateTime: 2023-02-11  19:54
 * @Description: TODO
 * @Version: 1.0
 */
//被增强类
@Component
public class User {
    public void add() {
        System.out.println("add……");
    }
}

UserProxy类

package com.atguigu.spring5.AOP;

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

/**
 * @BelongsProject: 02-Spring
 * @BelongsPackage: com.atguigu.spring5.AOP
 * @Author: dengLiMei
 * @CreateTime: 2023-02-11  19:55
 * @Description: TODO
 * @Version: 1.0
 */
//增强的类
@Component
@Aspect   //生成代理对象
public class UserProxy {
    //前置通知
    //@Before注解表示作为前置通知
    @Before(value = "execution(* com.atguigu.spring5.AOP.User.add())")
    public void before() {
        System.out.println("before.....");
    }

    //最终通知:方法之后就执行;有异常也执行
    @After(value = "execution(* com.atguigu.spring5.AOP.User.add())")
    public void After() {
        System.out.println("After.....");
    }

    //后置通知(返回通知):在返回结果之后执行:有异常不执行
    @AfterReturning(value = "execution(* com.atguigu.spring5.AOP.User.add())")
    public void AfterReturning() {
        System.out.println("AfterReturning.....");
    }

    //异常通知:有异常了才执行,没异常不执行
    @AfterThrowing(value = "execution(* com.atguigu.spring5.AOP.User.add())")
    public void AfterThrowing() {
        System.out.println("AfterThrowing.....");
    }

    //环绕通知
    //表示在方法之前和方法之后都执行
    @Around(value = "execution(* com.atguigu.spring5.AOP.User.add())")
    public void Around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("环绕之前.....");

        //被增强的方法执行
        proceedingJoinPoint.proceed();

        System.out.println("环绕之后.....");
    }
}

Main类

package com.atguigu.spring5.AOP;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @BelongsProject: 02-Spring
 * @BelongsPackage: com.atguigu.spring5.AOP
 * @Author: dengLiMei
 * @CreateTime: 2023-02-11  20:05
 * @Description: TODO
 * @Version: 1.0
 */
public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("aopbean.xml");
        User user = context.getBean("user", User.class);
        user.add();
    }
}

输出结果:

问题:对指定类的指定方法做增强

解决:对相同切入点进行抽取

PersonProxy类

在上面例子基础上增加一个新类

package com.atguigu.spring5.AOP;

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;

/**
 * @BelongsProject: 02-Spring
 * @BelongsPackage: com.atguigu.spring5.AOP
 * @Author: dengLiMei
 * @CreateTime: 2023-02-11  20:21
 * @Description: TODO
 * @Version: 1.0
 */
@Component
@Aspect
@Order(1)
public class PersonProxy {
    //后置通知(返回通知)
    @Before(value = "execution(* com.atguigu.spring5.AOP.User.add(..))")
    public void afterReturning(){
        System.out.println("Person Before……");
    }
}

输出结果:

有多个增强类对同一个方法进行增强,设置增强类优先级

在增强类上面增加注解@Order(数字类型值),数字类型值越小优先级越高

二、AspectJ配置方式

创建对象

配置aop增强

切入点

配置切面

Book类

package com.atguigu.spring5.AOP.AOPConfigue;

/**
 * @BelongsProject: 02-Spring
 * @BelongsPackage: com.atguigu.spring5.AOP.AOPConfigue
 * @Author: dengLiMei
 * @CreateTime: 2023-02-11  20:38
 * @Description: TODO
 * @Version: 1.0
 */
public class Book {
    public void buy(){
        System.out.println("买");
    }
}

BookProxy类

package com.atguigu.spring5.AOP.AOPConfigue;

/**
 * @BelongsProject: 02-Spring
 * @BelongsPackage: com.atguigu.spring5.AOP.AOPConfigue
 * @Author: dengLiMei
 * @CreateTime: 2023-02-11  20:40
 * @Description: TODO
 * @Version: 1.0
 */
public class BookProxy {
    public void before(){
        System.out.println("before……");
    }
}

Main类

package com.atguigu.spring5.AOP.AOPConfigue;

import com.atguigu.spring5.AOP.AOPAnnotation.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @BelongsProject: 02-Spring
 * @BelongsPackage: com.atguigu.spring5.AOP.AOPConfigue
 * @Author: dengLiMei
 * @CreateTime: 2023-02-11  20:44
 * @Description: TODO
 * @Version: 1.0
 */
public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("aopbean2.xml");
        Book book = context.getBean("book", Book.class);
        book.buy();
    }
}

输出结果:


Spring系列文章:

Spring——是什么?作用?内容?用到的设计模式?

Spring——Bean管理-xml方式进行属性注入

Spring——Bean管理-注解方式进行属性注入

Spring——什么是IOC?

Spring——AOP是什么?如何使用?

Spring——什么是事务?传播行为?事务隔离级别有哪些?

Spring——整合junit4、junit5使用方法

如果有想要交流的内容欢迎在评论区进行留言,如果这篇文档受到了您的喜欢那就留下你点赞+收藏脚印支持一下博主~

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

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

相关文章

【JAVA】List接口

🏆今日学习目标:List接口 😃创作者:颜颜yan_ ✨个人主页:颜颜yan_的个人主页 ⏰本期期数:第四期 🎉专栏系列:JAVA List接口一、ArrayList二、LinkedList总结一、ArrayList ArrayLis…

python完美实现一个自己的音乐服务器

最近发现,经常用的网易云音乐,有很多歌曲下架了,能听的越来越少了;歌单里的一些歌曲,现在要开通 VIP 才能听了。其实自己常听的歌曲不是很多,现在却有很多听不了了。怎么办呢,付费吗&#xff1f…

Python进阶-----面对对象5.0(面对对象三大特征之--多态)

目录 前言: 多态 习题 前言: 上一期讲了Python面对对象中的继承,而今天讲的是多态,其实多态跟继承是紧密相关的,换句话说多态是继承的一种表现形式,下面就一起来看看吧!(上一期链…

性价比高的骨传导蓝牙耳机,推荐几款性能高的骨传导耳机

​骨传导耳机,顾名思义是一种声音传递方式,利用头骨作为震动传导发声。不像一般耳机那样通过外耳或内耳传递声音。声音由耳部传播到头后产生振动刺激颅脑内听觉中枢引起听觉。因此是一种非入耳式的声音传播方式。而在选购过程中,对于价格、功…

自动驾驶目标检测项目实战(二)—基于Faster-RCNN的交通标志检测

自动驾驶目标检测项目实战——基于Faster-RCNN的交通标志检测 目前目标检测算法有很多,流行的就有faster-rnn和yolov,本文使用了faster-rnn框架进行训练,效果还不错,准确率,当然也可以使用更高版本的Yolov进行实战。本…

RK3568触摸屏驱动调试总结

硬件电路分析 RK3568 CPU通过I2C与触控板外设wdt87xx连接。 首先要根据电路图获取如下I2C的信息: 项目Value接在哪个I2Ci2c1I2C 寄存器地址0x2cHID 地址0x20中断B5 1、接在哪个I2C 如图,1接在I2C1: 2、使用哪个GPIO引脚接收触控板的中断 如图&#xf…

Ubantu从0开始配置深度学习RTX 4090+3090显卡的服务器

文章目录1. 基础2. 用户访问3. Pytorch环境的问题4. 显卡调度问题方法一:在shell命令前强制指定显卡方法二:在代码中强制指定显卡5. 各种各样的小BUG5.1 Liunx创建新用户登录异常:/usr/bin/xauth: error/timeout in locking authority file /…

Unity之向量计算

文章目录前言向量加法向量减法向量乘法/除法向量点乘(内积)向量叉乘(外积)向量归一化向量小结前言 讲讲Unity中的向量有关知识,一些概念在初高中就学过,就不解释了。向量只能与自己相同维度进行计算&#…

Zookeeper3.5.7版本——选举机制(第一次启动时)

目录一、第一次启动服务时Zookeeper的选举机制1.1、服务器1启动1.2、服务器2启动1.3、服务器3启动1.4、服务器4启动1.5、服务器5启动二、Zookeeper中的一些概念了解2.1、SID2.2、ZXID2.3、Epoch一、第一次启动服务时Zookeeper的选举机制 1.1、服务器1启动 服务器1启动&#x…

嵌入式学习笔记——STM32硬件基础知识

STM32开发硬件知识前言STM32最小系统电源电路晶振电路复位电路BOOT选择电路调试接口电路其他电路本文重点本文参考博客链接前言 上一篇中我们重点是讲了一下怎么搭建开发环境以及怎么下载烧录的过程,这都是解决的电脑端的开发环境问题,还没有到实际的开…

【数据结构】邻接矩阵和邻接图的遍历

写在前面 本篇文章开始学习数据结构的图的相关知识,涉及的基本概念还是很多的。本文的行文思路:学习图的基本概念学习图的存储结构——本文主要介绍邻接矩阵和邻接表对每种结构进行深度优先遍历和广度优先遍历先识概念话不多说,狠活献上学习思想等等&…

C++ Stack栈学习

1. stack的介绍和使用1.1 stack的介绍1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器&…

sync map思考

sync map 作为解决 map 并发读写问题的补充,用法上其实不复杂,有些惋惜的是,不支持 len 统计数量的方法。map 并发读写算得上一个非常严重的问题,会导致服务宕机,为了避免 map 的并发读写,一种解决办法是直…

华为机试题:HJ108 求最小公倍数(python)

文章目录(1)题目描述(2)Python3实现(3)知识点详解1、input():获取控制台(任意形式)的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…

软件工程知识-软件测试

1、软件测试是发现软件错误(缺陷)的主要手段: 从是否关系软件内部结构和具体实现的角度对软件测试进行分类 2.静态测试:以检查为主(桌前检查、代码走查、代码审查) 动态测试:实际运行程序&am…

Leetcode刷题一

目录序言树「结构」「遍历」「经验」「跨父节点」「题型」序言 笔记根据labuladong进行总结,极力推荐labuladong算法进行学习!! 树 0、算法一开始就应该刷树,了解递归的思想。 1、C语言中定义了一个结构体,然后申明…

通过指针引用数组的几种方法的原理和差异;以及利用指针引用数组元素的技巧

关于地址,指针,指针变量可以参考这篇文章: 地址,指针,指针变量是什么?他们的区别?符号(*)在不同位置的解释?_juechen333的博客-CSDN博客https://blog.csdn.n…

nginx http模块

模块依赖2. 模块的初始化2.1 location的定义location的定义包含以下几种location [ | ~ | ~* | ^~ ] uri { ... } location name { ... }:表示精确匹配,只有请求的url路径与后面的字符串完全相等时,才会命中,不支持location嵌套~&#xff1a…

有免费的PDF转Word吗?值得收藏的7个免费 PDF转Word工具请收好

PDF 和 DOC 是人们在工作中广泛使用的两种最流行的文档格式。PDF 是 Adobe 的便携式文档格式,DOC 是 Microsoft 的 Word 文档格式。PDF 是一种更安全可靠的文件格式,因为它很难编辑 PDF 文件,但是有一些称为 PDF 编辑器的工具可用于编辑 PDF …

【Linux】工具(4)——make/Makefile

本期博客我们的任务就是搞懂自动化构建工具——make/Makefile一、什么是make/Makefile📌make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make&…