【Spring篇】Spring的Aop详解

news2024/10/23 14:38:24

  

      🧸安清h:个人主页

  🎥个人专栏:【计算机网络】【Mybatis篇】【Spring篇】

🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 

目录

🎯初始Sprig AOP及术语

🎯基于XML的AOP实现

🚦配置Spring AOP的XML元素

✨配置切面

✨配置切入点

🚦示例

✨创建UserDao类

✨创建UserDaoImpl类

✨创建XmlAdvice类

✨applicationContext-xml.xml文件

✨创建测试类

🎯基于注解的AOP实现

🚦Spring提供的注解

🚦代码示例

✨创建UserDao类

✨创建UserDaoImpl类

✨创建AnnoAdvice类

✨applicationConext.xml文件

✨创建测试类


🎯初始Sprig AOP及术语

Spring AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的一个核心模块,它允许开发者将横切关注点(如日志、事务管理、安全等)从业务逻辑中分离出来,以提高代码的模块化和可重用性。以下是一些Spring AOP中常用的术语,根据例子来展示其用法:

LogUtils中的printLog()方法用来输出日志

需求:针对UserService的save和delete方法做日志输出的增强

  1. Join Point(连接点):能够被增强的叫做连接点。特指的是类中的方法,以上四个任何一个方法都可以被叫做连接点

  2. Pointcut(切入点):将要被增强的方法。一个切入点一定是一个连接点,但是一个连接点并不一定是一个切入点。在例子中save()和delete()为切入点。

  3. Advice(增强/通知):将要增强的功能所在的方法。例子中由于要对save和delete方法做日志的增强,所以printLog方法叫做增强advice。

  4. Aspect(切面):用来配置切入点和增强关系的。

  5. Target (目标对象):指的是将要被增强的方法所在的对象。例子中UserService对象就是Target对象。

  6. Weaving(织入):将增强运用到切入点的过程叫做织入。

  7. Proxy(代理):将增强运用到切入点之后形成的对象叫做代理对象。

🎯基于XML的AOP实现

Spring中AOP的代理对象是由IOC容器自动生成,所以开发者只需选择选择连接点,创建切面,定义切点并在XML中添加配置信息即可。Spring提供了一系列配置Spring AOP的XML元素。

AOP配置:在切面中配置切入点和增强的关系

🚦配置Spring AOP的XML元素

元素描述
<aop:config>Spring AOP配置的根元素
<aop:aspect>配置切面
<aop:pointcut>配置切入点
<aop:before>定义一个前置通知
<aop:after>定义一个后置通知
<aop:after-returning>定义一个返回后通知
<aop:around>定义一个环绕通知

✨配置切面

在定义<aop:aspect>元素时,通常会指定id,ref这两个属性。

属性名称描述
id用于定义切面的唯一标识,切面起的名字(可以不设置)
ref用于引用普通的Spring Bean,引用的切面类对象bean的id值

✨配置切入点

在定义<aop:pointcut>元素时,通常会指定id,expression这两个属性。

属性名称描述
id用于指定切入点的唯一标识
expression用于指定切入点关联的切入点的表达式

🚦示例

✨创建UserDao类

定义了用户数据操作的接口,包括增删改查四个方法。

public interface UserDao {
    public void insert();
    public void delete();
    public void update();
    public void select();
}

✨创建UserDaoImpl类

实现了UserDao接口,具体执行数据库操作的打印语句。

public class UserDaoImpl implements UserDao{
    @Override
    public void insert() {
        System.out.println("添加用户信息");
    }

    @Override
    public void delete() {
        System.out.println("删除用户信息");
    }

    @Override
    public void update() {
        System.out.println("修改用户信息");
    }

    @Override
    public void select() {
        System.out.println("查询用户信息");
    }
}

✨创建XmlAdvice类

定义了AOP切面,包含前置、后置、环绕、返回和异常通知方法。

public class XmlAdvice {
    // 前置通知
    public void before(JoinPoint joinPoint) {
        System.out.println("这是前置方法");
        System.out.println("目标类是:" + joinPoint.getTarget());
        System.out.println(",被织入增强处理的目标方法为:" + joinPoint.getSignature().getName());
    }

    // 返回通知
    public void afterReturning(JoinPoint joinPoint) {
        System.out.println("这是返回通知,方法不出现异常时调用");
        System.out.println(",被织入增强处理的目标方法为:" + joinPoint.getSignature().getName());
    }

    // 环绕通知
    public Object around(ProceedingJoinPoint point) throws Throwable {
        System.out.println("这是环绕之前的通知");
        Object object = point.proceed();
        System.out.println("这是环绕之后的通知");
        return object;
    }

    // 异常通知
    public void afterException() {
        System.out.println("异常通知!");
    }

    // 后置通知
    public void after() {
        System.out.println("这是后置通知!");
    }
}

✨applicationContext-xml.xml文件

Spring配置文件,配置了数据源、事务管理器、UserDaoImpl和XmlAdvice的Bean,并定义了AOP的切点和通知。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <aop:aspectj-autoproxy/>
    <context:component-scan base-package="com.xml"/>

    <bean id="userDao" class="com.xml.UserDaoImpl"/>
    <bean id="xmlAdvice" class="com.xml.XmlAdvice"/>

    <aop:config>
        <aop:pointcut id="pointcut" expression="execution(* com.xml.UserDaoImpl.*(..))"/>
        <aop:aspect ref="xmlAdvice">
            <aop:before method="before" pointcut-ref="pointcut"/>
            <aop:after-returning method="afterReturning" pointcut-ref="pointcut"/>
            <aop:around method="around" pointcut-ref="pointcut"/>
            <aop:after-throwing method="afterException" pointcut-ref="pointcut"/>
            <aop:after method="after" pointcut-ref="pointcut"/>
        </aop:aspect>
    </aop:config>
</beans>

✨创建测试类

测试类,通过Spring容器获取UserDao的Bean,并调用其方法来验证AOP功能是否正常工作。

public class TestXml {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-xml.xml");
        UserDao userDao = applicationContext.getBean("userDao", UserDao.class);
        userDao.delete();
        System.out.println();
        userDao.insert();
        System.out.println();
        userDao.select();
        System.out.println();
        userDao.update();
    }
}

这是部分运行出来的结果,由于过长,所以在这里只截取了delete部分的作为参考:

🎯基于注解的AOP实现

🚦Spring提供的注解

注解名称描述
@Aspect配置切面
@Pointcut配置切入点
@Before配置前置通知
@After配置后置通知
@Around配置环绕通知
@AfterReturning配置返回通知
@AfterThrowing配置异常通知

下面将通过一个示例来展现:

🚦代码示例

✨创建UserDao类

声明用户数据操作的接口

public interface UserDao {
    public void insert();
    public void delete();
    public void update();
    public void select();
}

✨创建UserDaoImpl类

实现UserDao接口,标注为Spring管理的Bean,并定义基本的数据库操作打印语句。

@Component("userDao")
public class UserDaoImpl implements UserDao{
    @Override
    public void insert() {
        System.out.println("添加用户信息");
    }

    @Override
    public void delete() {
        System.out.println("删除用户信息");
    }

    @Override
    public void update() {
        System.out.println("修改用户信息");
    }

    @Override
    public void select() {
        System.out.println("查询用户信息");
    }
}

✨创建AnnoAdvice类

定义切面,包括前置、后置、环绕、返回和异常通知,用于增强UserDaoImpl类的方法

@Aspect  //告诉Spring,这个东西是用来做AOP的
public class AnnoAdvice {
    //切点
    @Pointcut("execution(* com.xml.UserDaoImpl.*(..))")
    public void pointcut(){}
    //前置通知
    @Before("pointcut()")  //切入点和通知的绑定
    public void before(JoinPoint joinPoint){
        System.out.println("这是前置通知");
        System.out.println("目标类是:"+joinPoint.getTarget());
        System.out.println(",被织入增强处理的目标方法为:"+joinPoint.getSignature().getName());
    }
    //返回通知
    @AfterReturning("pointcut()")
    public void afterReturning(JoinPoint joinPoint){
        System.out.println("这是返回通知");
        System.out.println(",被织入增强处理的目标方法为:"+joinPoint.getSignature().getName());
    }
    //环绕通知
    @Around("pointcut()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        System.out.println("这是环绕通知之前的部分");
        Object object=point.proceed();
        System.out.println("这是环绕通知之后的部分");
        return object;
    }
    //异常通知
    @AfterThrowing("pointcut()")
    public void afterException(){
        System.out.println("这是异常通知");
    }
    //后置通知
    @After("pointcut()")
    public void after(){
        System.out.println("这是后置通知");
    }
}

✨applicationConext.xml文件

配置Spring的AOP命名空间、组件扫描和切面相关的Bean定义

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <aop:aspectj-autoproxy/>
    <context:component-scan base-package="com.xml"/>
    <bean id="annoAdvice" class="com.xml.AnnoAdvice"/>
</beans>

✨创建测试类

通过Spring容器获取UserDao的Bean,并调用其方法,预期将触发AnnoAdvice中定义的AOP通知

public class TestAnnotation {
    public static void main(String[]args){
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao=applicationContext.getBean("userDao", UserDao.class);
        userDao.delete();
        System.out.println();
        userDao.insert();
        System.out.println();
        userDao.select();
        System.out.println();
        userDao.update();
    }
}

以上就是今天要讲的内容了,主要讲解了Spring AOP的术语及其两种实现方式等相关内容,如果您感兴趣的话,可以订阅我的相关专栏。非常感谢您的阅读,如果这篇文章对您有帮助,那将是我的荣幸。我们下期再见啦🧸!

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

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

相关文章

SVM(支持向量机)

SVM&#xff08;支持向量机&#xff09; 引言 支持向量机(Support Vector Machine,SVM)&#xff0c;可以用来解答二分类问题。支持向量(Support Vector)&#xff1a;把划分数据的决策边界叫做超平面&#xff0c;点到超平面的距离叫做间隔。在SVM中&#xff0c;距离超平面最近…

京东笔试题

和谐敏感词 &#x1f517; 题目地址 &#x1f389; 模拟 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();String s scanner.next();String[] words new String[…

Mapbox GL 加载GeoServer底图服务器的WMS source

貌似加载有点慢啊&#xff01;&#xff01; 1 这是底图 2 这是加载geoserver中的地图效果 3源码 3.1 geoserver中的网络请求 http://192.168.10.10:8080/geoserver/ne/wms?SERVICEWMS&VERSION1.1.1&REQUESTGetMap&formatimage/png&TRANSPARENTtrue&STYL…

Linux--epoll(ET)实现Reactor模式

Linux–多路转接之epoll Reactor反应堆模式 Reactor反应堆模式是一种事件驱动的设计模式&#xff0c;通常用于处理高并发的I/O操作&#xff0c;尤其是在服务器或网络编程中。 基本概念 Reactor模式又称之为响应器模式&#xff0c;基于事件多路复用机制&#xff0c;使得单个…

网络与信息安全工程师最新报考介绍(工信部教育与考试中心)

文章目录 前言 网络与信息安全工程师职业介绍主要的工作内容职业技能要求网络与信息安全工程师职业前景怎么样网络与信息安全工程师工作方向网络与信息安全工程师适学人群 如何入门学习网络安全 【----帮助网安学习&#xff0c;以下所有学习资料文末免费领取&#xff01;----】…

solidworks(sw)右侧资源栏变成英文,无法点击

sw右侧资源栏变成英文&#xff0c;无法点击&#xff0c;如图 使用xxclean 的扩展功能 SW右侧栏是英文 toolbox配置无效 这个按钮 修复完成之后重新打开软件查看是否变成中文。

[linux]快速入门

学习目标 通过学习能够掌握以下的linux操作 操作系统 按照应用领域的不同, 操作系统可以分为几类 桌面操作系统服务器操作系统移动设备操作系统嵌入式操作系统 不同领域的主流操作系统 桌面操作系统 Windows(用户数量最多)MacOS(操作体验好&#xff0c;办公人士首选)Linux…

Spring AI : Java写人工智能(LLM)的应用框架

Spring AI&#xff1a;为Java开发者提供高效集成大模型能力的框架 当前Java调用大模型时&#xff0c;面临缺乏优质AI应用框架的挑战。Spring作为资深的Java应用框架提供者&#xff0c;通过推出Spring AI来解决这一问题。它借鉴了langchain的核心理念&#xff0c;并结合了Java面…

解密 Redis:如何通过 IO 多路复用征服高并发挑战!

文章目录 一、什么是 IO 多路复用&#xff1f;二、为什么 Redis 要使用 IO 多路复用&#xff1f;三、Redis 如何实现 IO 多路复用&#xff1f;四、IO 多路复用的核心机制&#xff1a;epoll五、IO 多路复用在 Redis 中的工作流程六、IO 多路复用的优点七、IO 多路复用使用中的注…

安装buildkit,并使用buildkit构建containerd镜像

背景 因为K8s抛弃Docker了,所以就只装了个containerd,这样就需要一个单独的镜像构建工具了,就用了buildkit,这也是Docker公司扶持的,他们公司的人出来搞的开源工具,官网在 https://github.com/moby/buildkit 简介 服务端为buildkitd,负责和runc或containerd后端连接干活,目前…

w~自动驾驶合集6

我自己的原文哦~ https://blog.51cto.com/whaosoft/12286744 #自动驾驶的技术发展路线 端到端自动驾驶 Recent Advancements in End-to-End Autonomous Driving using Deep Learning: A SurveyEnd-to-end Autonomous Driving: Challenges and Frontiers 在线高精地图 HDMa…

windows文件拷贝给wsl2的Ubuntu

参考&#xff1a; windows文件如何直接拖拽到wsl中_win 移到文件到wsl-CSDN博客 cp -r /mnt/盘名/目标文件 要复制到wsl中的位置e.g.cp -r /mnt/d/byt5 /home Linux文件复制、移动、删除等操作命令_linux移动命令-CSDN博客 Linux 文件、文件夹的复制、移动、删除 - Be-myse…

构建后端为etcd的CoreDNS的容器集群(二)、下载最新的etcd容器镜像

在尝试获取etcd的容器的最新版本镜像时&#xff0c;使用latest作为tag取到的并非最新版本&#xff0c;本文尝试用实际最新版本的版本号进行pull&#xff0c;从而取到想的最新版etcd容器镜像。 一、用latest作为tag尝试下载最新etcd的镜像 1、下载镜像 [rootlocalhost opt]# …

多品牌摄像机视频平台EasyCVR海康大华宇视视频平台如何接入多样化设备

在实际的工程项目里&#xff0c;我们常常会面临这样的情况&#xff1a;项目管理者可能会决定使用多个品牌的视频监控摄像头&#xff0c;或者有需求将现有的、多种类型的监控系统进行整合。现在&#xff0c;让我们来探讨一下如何实现不同品牌摄像头的连接和使用。 1、GB/T281协议…

2024版最新148款CTF工具整理大全(附下载安装包)含基础环境、Web 安全、加密解密、密码爆破、文件、隐写、逆向、PWN

经常会有大学生粉丝朋友私信小强&#xff0c;想通过打CTF比赛镀金&#xff0c;作为进入一线互联网大厂的门票。 但是在CTF做题很多的时候都会用到工具&#xff0c;所以在全网苦寻CTF比赛工具安装包&#xff01; 关于我 有不少阅读过我文章的伙伴都知道&#xff0c;我曾就职于…

SSM框架实战小项目:打造高效用户管理系统 day3

前言 在前两篇博客中&#xff0c;后台已经搭建完毕&#xff0c;现在需要设计一下前端页面 webapp下的项目结构图 创建ftl文件夹&#xff0c;导入css和js 因为我们在后台的视图解析器中&#xff0c;设置了页面解析器&#xff0c;跳转路径为/ftl/*.ftl&#xff0c;所以需要ftl文件…

JAVA开源项目 网上订餐系统 计算机毕业设计

本文项目编号 T 018 &#xff0c;文末自助获取源码 \color{red}{T018&#xff0c;文末自助获取源码} T018&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 新…

Pycharm通过ssh远程docker容器搭建开发环境

本地pycharm通过ssh方式远程连接服务器&#xff08;Ubuntu&#xff09;上的docker容器&#xff0c;搭建开发环境。实现功能&#xff1a;将环境依赖打包成docker镜像&#xff0c;并在远程服务器中启动容器&#xff08;启动时做好端口映射和文件夹挂载&#xff09;&#xff0c;通…

负载箱的作用?

负载箱&#xff0c;顾名思义&#xff0c;就是用来承载电力设备的箱子。在电力系统中&#xff0c;负载箱的作用非常重要&#xff0c;它不仅可以模拟实际的电力负载&#xff0c;还可以对电力设备进行测试和调试&#xff0c;确保其正常运行。下面详细介绍负载箱的作用。 1. 模拟实…

15分钟学Go 第7天:控制结构 - 条件语句

第7天&#xff1a;控制结构 - 条件语句 在Go语言中&#xff0c;控制结构是程序逻辑的重要组成部分。通过条件语句&#xff0c;我们可以根据不同的条件采取不同的行动。今天我们将详细探讨Go语言中的两种主要条件结构&#xff1a;if语句和switch语句。理解这些控制结构对于编写…