【Spring进阶系列丨第八篇】Spring整合junit 面向切面编程(AOP)详解

文章目录

  • 一、Spring整合junit
    • 1.1、导入spring整合junit的jar
    • 1.2、在测试类上添加注解
    • 1.3、说明
  • 二、面向切面编程(AOP)
    • 2.1、问题引出
    • 2.2、AOP
      • 2.2.1、概念
      • 2.2.2、作用
      • 2.2.3、优势
      • 2.2.4、实现方式
      • 2.2.5、专业术语
        • 2.2.5.1、连接点
        • 2.2.5.2、切入点
        • 2.2.5.3、通知/增强
        • 2.2.5.4、织入
        • 2.2.5.5、切面
        • 2.2.5.6、引介【了解】
  • 好书推荐

在这里插入图片描述

一、Spring整合junit

1.1、导入spring整合junit的jar

<dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.2.1.RELEASE</version><scope>test</scope>
</dependency>

1.2、在测试类上添加注解

@ContextConfiguration(classes = {SpringMainConfig.class})
@RunWith(SpringJUnit4ClassRunner.class)
public class ConditionalTest {@Autowiredprivate Pig pig;@Testpublic void testPig() throws Exception{System.out.println(pig);}
}

1.3、说明

​ @ContextConfiguration注解需要注意的细节是:

  • classes:指定的是主配置类的字节码
  • locations:指定xml文件的位置

二、面向切面编程(AOP)

2.1、问题引出

​ 首先来看一个问题,假如我现在有一个UserServiceImpl用户业务类,其中呢,有一个保存用户的方法,即:

public class UserServiceImpl {// 保存用户public void save(User user){// 调用Dao新增用户}
}

​ 现在的需求是:我要在保存用户之前新增事务的功能,你可能会这么做:

public void save(User user){// 1、新增事务功能代码// 调用Dao新增用户
}

​ 现在的需求又变了,我要在保存用户之前不仅新增事务功能了,还要添加日志功能了,你可能又会这么做:

public void save(User user){// 2、新增记录日志功能代码// 1、新增事务功能代码// 调用Dao新增用户
}

​ 现在的需求又变了,我要在保存用户之前不仅新增事务功能了,日志功能了,还要增加开始执行保存用户方法的开始时间的功能了,你可能又会这么做:

public void save(User user){// 3、新增统计开始执行保存用户方法的开始时间功能// 2、新增记录日志功能代码// 1、新增事务功能代码// 调用Dao新增用户
}

​ 现在的需求又变了,我要在保存用户之前不仅新增事务、日志功能、统计方法开始执行时间,还要新增用户是否有权限访问这个方法功能,你可能又会这么做:

public void save(User user){// 4、新增判断用户是否有权限功能// 3、新增统计开始执行保存用户方法的开始时间功能// 2、新增记录日志功能代码// 1、新增事务功能代码// 调用Dao新增用户
}

​ 需求又在一直改变改变着,可能忽然领导突然哪一天大腿一拍,说这些新增的功能都不要了,好,我们把我们辛苦写的代码全部注释了,也可能一气之下全删了;又过了几天,领导又抽风了,说我们需要新增事务和权限,好,我们又吭哧吭哧的去改代码了;…领导反复抽风,我们反复改反复改…最后我们顶不住压力,自杀了。

​ 出现这个问题的原因在于:反复改需求,而这些需求与我们真正要保存用户的业务逻辑关系不大,同时,我们还应该需要考虑到的是:我们的系统中可能不仅仅只有用户模块,还有商品模块,订单模块,分类模块等等。而这些模块在保存相应的数据的时候,都有可能需要新增事务、日志、时间统计、权限等功能。那么如果我们对保存的数据方法都全部写一遍新增事务功能、新增日志功能、新增时间统计功能、新增权限功能,这样的代码无疑是很臃肿的,而且是很难维护的,想到这里,你可能会这么做,把公共的代码抽取出来,可能这么干:

public class BaseService {// 新增事务public void transaction(){System.out.println("事务功能");}// 新增日志public void log(){System.out.println("日志功能");}
}
public class UserServiceImpl extends BaseService{public void save(User user){super.log();super.transaction();// 调用Dao新增用户}
}

​ 解决方案:把公共代码抽取到一个父类的BaseService,让具体的模块Service继承BaseService,然后调用父类的功能,这样做即:通过继承的方式实现对业务方法的功能的增强。

​ 但是这样做还有一个问题,虽然我们其他模块也需要此功能时,可以采用继承的方式来做,但是一个很严重的问题是:我们的业务功能在去调用的时候,对业务功能的增强实际上还是硬编码了。还是没有解决方便维护的问题,那我们期望能够解决的问题是:能否“神不知鬼不觉”的在不改变源代码的情况下去扩展功能呢? 答案肯定是可以的,那这就是AOP,同时,这个也是我们学习AOP的原因所在,也是AOP的作用所在。

在这里插入图片描述

​ 从上图可以看出,如果从系统的横向角度来看,我们的权限功能,日志功能,事务功能是把系统的各个模块中的各个业务方法在执行之前从前面拦截了,好像拿了一把刀把一个完整的苹果切成一半,形成了一个切面。这个也就是=="面向切面编程==中切面的含义。

2.2、AOP

2.2.1、概念

​ AOP:全称是 Aspect Oriented Programming 即:面向切面编程/面向方面编程。AOP不是一项新的技术,是OOP(面向对象编程)技术的补充,是OOP的延续,同时也是Spring最重要的内容之一。

​ 简单来说,AOP就是把我们程序重复的代码抽取出来,在需要执行的时候,使用代理技术,在不修改源码的基础上,对我们的已有方法进行增强。

​ Spring框架的AOP机制可以让开发者把业务流程中的通用功能抽取出来,单独编写功能代码。在业务流程执行过程中,Spring框架会根据业务流程要求,自动把独立编写的功能代码切入到流程的合适位置。

2.2.2、作用

​ 在程序运行期间,不修改源码对已有方法进行增强。

2.2.3、优势

  • 减少重复代码
  • 提高开发效率
  • 维护方便

2.2.4、实现方式

动态代理

2.2.5、专业术语

2.2.5.1、连接点

​ 全英叫:Joinpoint。所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的连接点。

2.2.5.2、切入点

​ 全英叫:Pointcut。所谓切入点是指我们要对哪些 Joinpoint 进行拦截。

2.2.5.3、通知/增强

​ 全英叫:Advice。所谓通知/增强是指拦截到 Joinpoint 之后所要做的事情就是通知。说白了,就是一段功能性的代码。

通知的类型

  • 前置通知

  • 后置通知

  • 异常通知

  • 最终通知

  • 环绕通知

    try{// 前置通知【开启事务】// 业务代码....// 后置通知【提交事务】}catch (Exception  e){// 异常通知 【回滚事务】
    }finally {// 最终通知 【释放资源】
    }
    
2.2.5.4、织入

​ 全英叫:Weaving。是指把增强应用到目标对象来创建新的代理对象的过程,是一个动作。

2.2.5.5、切面

​ 全英叫:Aspect。是切入点和通知/增强的结合。

2.2.5.6、引介【了解】

​ 全英叫:Introduction。引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field。


好书推荐

在这里插入图片描述

《快捷学习Spring》

对于Java开发人员来说,Spring是必须学习的框架。这个不可思议的开发工具支持从小型企业电子商务应用程序到企业级微服务的一切。掌握Spring是一个漫长的过程。迈出第一步很容易!从这里开始。
本书向Java开发人员介绍如何使用Spring框架构建应用程序。书中包含信息丰富的图表以及相关的例子,作者清晰生动的写作,能帮助读者轻松掌握所需的技能。本书阐述了如何规划、编写和测试应用程序。通过关注最重要的特性,本书为探索Spring丰富的生态系统提供了坚实的基础。

作者简介

Laurenţiu Spilcă是Endava的专职开发主管和培训师,他负责欧洲、美国和亚洲客户的金融市场项目开发。他有超过10年的开发经验。Laurenţiu相信,重要的不仅是交付高质量的软件,还要分享知识和帮助他人提升技能。这些信念驱使他去设计和讲授与Java技术相关的课程,并进行演示和参与研讨会。

购书链接:点此进入

在这里插入图片描述

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

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

相关文章

5款最值得推荐的电脑监控软件丨高人气甄选

在企业和学校等场所&#xff0c;电脑监控软件被广泛应用于员工或学生的行为管理。 通过监控软件&#xff0c;管理者可以了解员工或学生的学习和工作情况&#xff0c;及时发现并纠正不当行为&#xff0c;提高工作效率和学习效果。同时&#xff0c;这类软件还可以用于保护企业机…

AI概念普及-LangChain

文章目录 概念产品架构核心特性核心组件使用场景其他资源开发支持结论Langchain详细介绍LangChain的具体实现原理LangChain如何与其他大型语言模型&#xff08;LLM&#xff09;集成&#xff0c;有哪些具体的接口或协议&#xff1f;LangChain的性能表现和优化策略有哪些&#xf…

【多线程】线程(线程的概念+线程的创建)

文章目录 线程一、线程的概念1.引入线程的目的2.什么叫线程&#xff08;Thread&#xff09;1.线程的特点&#xff1a;2.进程和线程的区别&#xff08;面试题&#xff09;&#xff1a;3.Java的多线程编程 二、创建线程1.继承Thread重写run入口方法&#xff1a;使用jconsolesleep…

Games101-光线追踪(加速结构)

Bounding Volumes 包围盒&#xff1a;用一个简单形状把物体包围起来&#xff0c;如果物体连包围盒都无法碰撞&#xff0c;一定无法碰撞包围盒内的物体 将长方体理解成三个不同对面形成的交集&#xff0c;一定是在x&#xff0c;y&#xff0c;z轴上的范围。没有旋转 Ray Inters…

适用于 Windows 10 的 10 大免费数据恢复软件

数据丢失可能是一场噩梦&#xff0c;尤其是在涉及重要文件和文档时。无论是由于意外删除、系统崩溃还是病毒攻击&#xff0c;找到适合 Windows 10 的文件夹恢复软件都可以在恢复丢失的数据方面发挥重要作用。在本指南中&#xff0c;我们将探索适用于 Windows 10 用户的 10 大免…

mysql解锁表及查看表是否被锁

1、查进程&#xff0c;查找被锁表的那个进程的ID show processlist; 2、通过查询结果&#xff0c;找到要杀掉的进程&#xff0c;kill掉锁表的进程ID kill id; 3、查询是否锁表 show OPEN TABLES where In_use > 0; 1.delete------ 是逐行删除速度极慢&#xff0c;不适合…

【退役之重学Java】pom文件没啥问题但报红

复制过来的pom文件&#xff0c;有几处版本号报红 刚开始以为是版本号的问题&#xff0c;但是按道理从大佬那里复制过来的&#xff0c;应该不会有问题&#xff0c;还是检查了一下&#xff1a; 把项目压缩发给师傅&#xff0c;师傅哪里没报错好吧&#xff0c;我已经猜到了为什么……

MySQL操作DDL

目录 1.概述 2.数据库的增删改查 3.表的增删改查 3.1.创建和查看表结构 3.2.修改表 3.3.查看所有的表 3.4.删除表 4.用户 5.DDL在实际应用场景中的作用 5.1.数据库设计 5.2.数据库维护 ​​​​​​​5.3.数据库迁移或重置 ​​​​​​​5.4.优化性能 ​​​​​…

cesium 添加动态波纹效果 圆形扩散效果 波纹材质

一、扩展材质 /*** 水波纹扩散材质* param {*} options* param {String} options.color 颜色* param {Number} options.duration 持续时间 毫秒* param {Number} options.count 波浪数量* param {Number} options.gradient 渐变曲率*/function CircleWaveMaterialProperty(opt…

网络学习学习笔记

NETEBASE学习笔记 一.VRP系统1.四种视图模式2.基础命令 二.TCP/IP1.五层模型 一.VRP系统 1.四种视图模式 (1)< Huawei > 用户视图 【查看运行状态】 (2)[Huawei] 系统视图 【配置设备的系统参数】 system-view /sys 进入系统视图 CtrlZ/return 直接返回用户视图 (3)[Hua…

【金句推荐】适合写进摘抄本的优美句子

1.人间骄阳刚好&#xff0c;风过林梢&#xff0c;彼时他们正当年少。 2.这路遥马急的人间渐行、渐远、渐无声&#xff0c;看淡若清风的现世且听、且吟、且从容。 3.一个能够升起月亮的身体&#xff0c;必然驮住了无数次日落。 4.并不可否认&#xff0c;生活磨掉了我们一部分…

数学建模-------MATLAB分支循环断点调试

1.if语句 &#xff08;1&#xff09;分段函数的引入&#xff08;这里的数据表示的是分数的不同区间对应的等级&#xff09; (1)这个就是一个十分简单的if语句&#xff0c;无论是if还是elseif后面都是不能添加任何分号的&#xff0c;这个例子就是一个分段的函数&#xff0c;在不…

mac/win使用pyinstaller打包app/exe文件,活着执行脚本,双击运行

&#x1f338; 踩坑记录 python环境最好使用虚拟环境&#xff0c;推荐使用conda管理&#xff0c;并且若本地有python环境&#xff0c;不要使用和 本地环境版本 相同的虚拟环境 这里踩坑较多&#xff0c;已经记不清楚注意点 虚拟环境python版本不要和本地环境一样 mac/win只能…

清理垃圾软件哪个好?电脑清理优化4种方法

在数字时代&#xff0c;我们的电脑经常会被各种软件、程序和文件所占据&#xff0c;其中不乏一些无用甚至有害的垃圾软件。这些软件不仅占用了大量的存储空间&#xff0c;还可能拖慢电脑的运行速度&#xff0c;甚至威胁到我们的信息安全。因此&#xff0c;定期清理和优化电脑变…

紧急备考全攻略,如何短期通过PMP考试?

今年身边有很多同事朋友都要考PMP&#xff0c;而我属于这些人里”第一个吃螃蟹“的人&#xff0c;一次拿下5A&#xff0c;下面分享一下我自己备考PMP的经验。 我是根据自己的学习计划复习的&#xff0c;不能说这些方法适合所有人&#xff0c;但对备考的伙伴们来说&#xff0c;…

分布式文件系统

引言&#xff1a; GFS是一个可扩展的分布式文件系统&#xff0c;用于大型的、分布式的、对大量数据进行访问的应用。它运行于廉价的普通硬件上&#xff0c;并提供容错功能。它可以给大量的用户提供总体性能较高的服务。 一、 GlusterFS 概述 1.1 GlusterFS简介 GlusterFS 是…

跳动的♥心

代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style…

git实现代码版本控制

一、在github新建一个仓库 二、在本地执行以下代码 git init git add . git commit -m "first commit" git branch -M main git remote add origin gitgithub.com:thekingofjumpshoot/blog.git git push -u origin main 代码解析 然后就上传到github上了 三、第二…

如何通过代码混淆绕过苹果机审,解决APP被拒问题

目录 iOS代码混淆 功能分析 实现流程 类名修改 方法名修改 生成垃圾代码 替换png等静态资源MD5 info.plist文件添加垃圾字段 功能分析 实现流程 类名修改 方法名修改 生成垃圾代码 替换png等静态资源MD5 info.plist文件添加垃圾字段 混淆前后对比 iOS代码混淆 …

南京航空航天大学-考研科目-513测试技术综合 高分整理内容资料-01-单片机原理及应用分层教程-单片机有关常识部分

系列文章目录 高分整理内容资料-01-单片机原理及应用分层教程-单片机有关常识部分 文章目录 系列文章目录前言总结 前言 单片机的基础内容繁杂&#xff0c;有很多同学基础不是很好&#xff0c;对一些细节也没有很好的把握。非常推荐大家去学习一下b站上的哈工大 单片机原理及…