SpringAOP的使用总结

news2025/1/23 10:35:00

 B站

【尚硅谷新版SSM框架全套视频教程,Spring6+SpringBoot3最新SSM企业级开发】https://www.bilibili.com/video/BV1AP411s7D7?p=47&vd_source=726decf3eb63273901caae35ad437124

AOP即面向切面编程,通过使用一定的技术将非核心方法抽离出来,放入统一的类中进行管理,在目标方法(核心方法)需要使用对应的非核心方法时,再将非核心方法插入的核心方法中,最后形成一个整合类进行使用.

需要导入相应的依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.3.25</version>
</dependency>

spring-context依赖中包含了spring-aop依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>5.3.25</version>
</dependency>

方式一:通过类的接口实现AOP操作

创建接口:

@Service
public interface Colculer {
    int Plus(int a,int b);
    int subtract(int a,int b);
    int multiply(int a,int b);
    int divide(int a,int b);
}

创建实现类:

@Component
public class Colcu implements Colculer {

    @Override
    public int Plus(int a,int b) {
        int result=a+b;
        return result;
    }

    @Override
    public int subtract(int a, int b) {
        return a-b;
    }

    @Override
    public int multiply(int a, int b) {
        return a*b;
    }

    @Override
    public int divide(int a, int b) {
        return a/b;
    }
}

创建配置类:(注意配置类中需要声明开启对adpect的注解)

//表示我这个是一个配置类
@Configuration
//指定我要扫描的位置
@ComponentScan({"Com.su"})
//开启对aspect的注解
@EnableAspectJAutoProxy
public class ConfigClass {
}

创建增强类:(@aspect注解表示他是一个切面)

@Component
@Aspect
public class AopLog {
    //前置通知
    @Before("execution(* Com.su.*.*(..))")
    public void log(){
        System.out.println("输出了");
    }
}

在测试类中调用被增强后的类中的方法:

//@SpringJUnitConfig(value = ConfigClass.class)
@ContextConfiguration(classes = {ConfigClass.class})
@RunWith(SpringJUnit4ClassRunner.class)
public class MyTest {
    @Autowired
    private Colculer colculer;

   @Test
    public void test01(){
       int result = colculer.Plus(2, 6);
       System.out.println("a+b="+result);
    }
}

 调用方法后发现被调用的方法被增强了结果如下:

九月 08, 2023 10:39:33 上午 org.springframework.test.context.support.AbstractTestContextBootstrapper getDefaultTestExecutionListenerClassNames
信息: Loaded default TestExecutionListener class names from location [META-INF/spring.factories]: [org.springframework.test.context.web.ServletTestExecutionListener, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener, org.springframework.test.context.event.ApplicationEventsTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionalTestExecutionListener, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener, org.springframework.test.context.event.EventPublishingTestExecutionListener]
九月 08, 2023 10:39:33 上午 org.springframework.test.context.support.AbstractTestContextBootstrapper getTestExecutionListeners
信息: Using TestExecutionListeners: [org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener@3abbfa04, org.springframework.test.context.event.ApplicationEventsTestExecutionListener@57fffcd7, org.springframework.test.context.support.DependencyInjectionTestExecutionListener@31ef45e3, org.springframework.test.context.support.DirtiesContextTestExecutionListener@598067a5, org.springframework.test.context.event.EventPublishingTestExecutionListener@3c0ecd4b]
输出了
a+b=8

AOP增强类的解释:

切面:可以理解为创建的这个aspect注解类就是切面

切点:被选中的方法即为切点execution(方法的全路径)

增强:方法中的具体代码

 拓展1:

注解的形式开启AOP

<?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">

<!--    注解的形式开启AOP-->
    <aop:aspectj-autoproxy/>
</beans>

 配置类:

//开启对aspect的注解
@EnableAspectJAutoProxy

拓展2:

拓展3:

在测试方法中将声明接口改为声明接口实现类

无法实现对应代理类

原因:在进行AOP动态代理时,底层会根据类的类型选择对应的代理模式,这个类中有对应的接口,所以代理时会选用JDK动态代理的形式,而JDK代理会根据这个类对应的接口实现一个代理类.

即代理对象和目标对象是兄弟关系(不很懂!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)

来自弹幕的解释(相当于bc都实现了a接口,但bc不是子父类的关系,无法用多态。但是如果没实现接口,代理对象和被增强对象是父子类关系,是可以用多态来接受的)

通过上面的测试可得:即在IOC容器中真正存储的都是代理对象,不是目标对象

 拓展4:如何在增强类中获取我们的目标信息(只需要在方法中添加一个形参JoinPoint)

注意是JoinPoint不是JointPoint

1.获取方法所属的类的信息

2.获取方法的名称

3.获取参数的列表

@Component
@Aspect
public class AopLog {
    //前置通知
    @Before("execution(* Com.su.*.*(..))")
    public void log(JoinPoint joinPoint){
        //获取方法所属的类的信息
        String simpleName = joinPoint.getTarget().getClass().getSimpleName();
        //获取方法的名称
        String name = joinPoint.getSignature().getName();
        //获取参数列表
        Object[] args = joinPoint.getArgs();
        System.out.println("simpleName是"+simpleName+"name"+name+"args是"+args);
        System.out.println("输出了");
        System.out.println(simpleName);
    }
}

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

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

相关文章

关于 ogbg-molhi数据集的个人解析

cs224w_colab2.py这个图属性预测到底咋预测的 dataset.meta_info.T Out[2]: num tasks 1 eval metric rocauc download_name …

阿里云和腾讯云2核2G服务器价格和性能对比

2核2G云服务器可以选择阿里云服务器或腾讯云服务器&#xff0c;腾讯云轻量2核2G3M带宽服务器95元一年&#xff0c;阿里云轻量2核2G3M带宽优惠价108元一年&#xff0c;不只是轻量应用服务器&#xff0c;阿里云还可以选择ECS云服务器u1&#xff0c;腾讯云也可以选择CVM标准型S5云…

SpringBoot整合Redis 并 展示使用方法

步骤 引入依赖配置数据库参数编写配置类构造RedisTemplate创建测试类测试 1.引入依赖 不写版本号&#xff0c;也是可以的 在pom中引入 <!--redis配置--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-…

Kafka消费者组重平衡(一)

文章目录 概述消费者组特点什么是 Coordinator重平衡影响 概述 重平衡&#xff0c;也就是Rebalance, 就是让一个 Consumer Group 下所有的 Consumer 实例就如何消费订阅主题的所有分区达成共识的过程。在 Rebalance 过程中&#xff0c;所有 Consumer 实例共同参与&#xff0c;…

ShardingSphere分库分表(一):高性能架构模式

互联网业务兴起之后&#xff0c;海量用户加上海量数据的特点&#xff0c;单个数据库服务器已经难以满足业务需要&#xff0c;必须考虑数据库集群的方式来提升性能。高性能数据库集群的第一种方式是“读写分离”&#xff0c;第二种方式是“数据库分片”。 文章目录 1、读写分离架…

地理测绘基础知识(6) 照射距离等值线计算

上一篇文章中&#xff0c;我们采用HPR坐标系里的向量旋转&#xff0c;在地表绘制了这样的螺旋线&#xff1a; 在复杂多样的现实应用需求中&#xff0c;还有一种更为普遍的计算需求&#xff0c;就是求取地表到全向光源的距离为D的所有点的集合&#xff08;用多边形组成的近似椭…

MongoDB简介以及安装

文章目录 1. MongoDB简介2. NoSQL简介3. MongoDB安装 1. MongoDB简介 MongoDB是一种NoSQL数据库&#xff0c;采用了文档数据库模型。它以BSON&#xff08;Binary JSON&#xff09;格式存储数据&#xff0c;支持动态模式和灵活的查询语言。MongoDB具有以下特点&#xff1a; 文…

虚拟机 + Ubuntu22.04 + ros2 (humble) colcon build turtlebot3_node失败的解决方案

一、问题描述 在虚拟机Ubuntu22.04中安装了ROS2&#xff08;humble&#xff09;,下载turtlebot3。在colcon build --symlink-install 编译的过程中turtlebot3_Fake_node一直失败&#xff0c;无法正常运行&#xff0c;影响后面的仿真测试。 二、解决方案 查阅相关资料后发现问…

JAVA 从入门到起飞 面向对象 day08 P2

老师的知识点1 在JAVA中&#xff0c;必须先设计类&#xff0c;才能获得对象。 我的理解&#xff1a; 疑问&#xff1a;为什么是这样的呢&#xff1f; 答案&#xff1a; 在 JAVA 或其他面向对象的编程语言中&#xff0c;类是对象的蓝图或模板。这意味着在你创建对象之前&am…

【已解决】在Win11上离线安装 .NET Framework 3.5的方法【含网盘离线文件】

随 Windows 11提供的是.NET Framework 4.8&#xff0c;该环境可以运行任何 .NET Framework 4.x 应用。 而.NET Framework 3.5 支持为 .NET Framework 2.0 到 3.5 生成的应用&#xff0c;需要自行安装。 当Win11的应用软件需要.net framework3.5的运行环境时&#xff0c;就会提…

领域驱动设计:微服务架构模型

文章目录 整洁架构六边形架构DDD 分层架构三种微服务架构模型的对比和分析从三种架构模型看中台和微服务设计 整洁架构 整洁架构又名“洋葱架构”。为什么叫它洋葱架构&#xff1f;整洁架构的层就像洋葱片一样&#xff0c;它体现了分层的设计思想。在整洁架构里&#xff0c;同…

跨站请求伪造

CSRF是什么&#xff1f; 跨站请求伪造(Cross Site Request Forgery&#xff0c;CSRF)是一种攻击&#xff0c;它强制浏览器客户端用户在当前对其进行身份验证后的Web 应用程序上执行非本意操作的攻击&#xff0c;攻击的重点在于更改状态的请求&#xff0c;而不是盗取数据&#x…

西部是真的地广人稀啊,常用地市东西分布差异明显

背景 最近在使用folium处理一些工作上的事情&#xff0c;这过程中发现一些GPS坐标数据的获取和置换不是太方便&#xff0c;尤其是坐标置换&#xff0c;做了一些工作进行了GPS坐标数据秘坐标置换方向的封装。 GPS坐标类封装的过程中&#xff0c;发现一些常用的GPS坐标的查取比…

安装程序报错“E: Sub-process /usr/bin/dpkg returned an error code (1)”的解决办法

今天在终端使用命令安装程序时出现了如下的报错信息。 E: Sub-process /usr/bin/dpkg returned an error code (1) 这种情况下安装什么程序最终都会报这个错&#xff0c;具体的报错截图如下图所示。 要解决这个问题&#xff0c;首先使用下面的命令进到相应的目录下。 cd /var/…

项目02—基于keepalived+mysqlrouter+gtid半同步复制的MySQL集群

文章目录 一.项目介绍1.拓扑图2.详细介绍 二.前期准备1.项目环境2.IP划分 三. 项目步骤1.ansible部署软件环境1.1 安装ansible环境1.2 建立免密通道1.3 ansible批量部署软件1.4 统一5台mysql服务器的数据 2.配置基于GTID的半同步主从复制2.1 在master上安装配置半同步的插件,再…

蓝桥杯官网练习题(玩具蛇)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小蓝有一条玩具蛇&#xff0c;一共有 16 节&#xff0c;上面标着数字 1 至 16。每一节都是一个正方形的形状。相邻的两节可以成直线或者成 90 度角。 小蓝还有一个…

ROS学习笔记(五)---话题发布

1. 话题通信是什么 在ROS&#xff08;机器人操作系统&#xff09;中&#xff0c;话题通信是一种常用的通信机制&#xff0c;用于在不同的ROS节点之间传递消息。话题通信基于发布者-订阅者模式&#xff0c;其中一个节点&#xff08;发布者&#xff09;发布消息到一个特定的话题…

使用最新android sdk 将jar文件编译成dex

最近需要一些比较骚的操作&#xff0c;所以需要将gson编译成dex。 因为手上有jar包&#xff0c;所以就拿出了android sdk准备一把入魂&#xff0c;结果报错不断&#xff0c;让人无奈。只好根据报错来调整编译步骤&#xff0c;不得不为安卓环境更新Debug。 1、dx变d8 并不确定…

postgresql-通用表达式

postgresql-通用表达式 入门案例简单CTE递归 CTE案例1案例2 入门案例 -- 通用表达式 with t(n) as (select 2) select * from t;简单CTE WITH cte_name (col1, col2, ...) AS (cte_query_definition ) sql_statement;WITH 表示定义 CTE&#xff0c;因此 CTE 也称为 WITH 查询…

Pandas中at、iat函数详解

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 at 函数&#xff1a;通过行名和列名来取值&#xff08;取行名为a, 列名为A的值&#xff09; iat 函数&#xff1a;通过行号和列号来取值&#xff08;取第1行&#xff0c;第1列的值&#xff09; 本文给出at、iat常见的…