作为spring框架的另外的重点AOP的介绍(详细篇)

news2024/9/24 19:22:48

一.Aop介绍,以及作用范围,和其专业名词的解释

1.什么是Aop?

Java Spring中的AOP(面向切面编程)是一种编程范式,用于通过将与核心业务逻辑无关的横切关注点(如日志记录、性能统计、安全控制等)与核心业务逻辑进行分离,从而提高代码的可维护性和可重用性。

在Java Spring中,AOP通过切面(Aspect)来定义和管理横切关注点。一个切面是由切点(Pointcut)和通知(Advice)组成的。切点定义了在哪些连接点(Joinpoint)上进行横切,通知定义了在连接点上实际执行的逻辑。

切点定义了在连接点上选择哪些具体的执行点进行横切。它可以通过表达式或注解等方式指定。例如,可以使用表达式语言来选择所有的Service层方法作为切点。

通知定义了在连接点上执行的具体逻辑。在Java Spring中,常见的通知类型包括前置通知(Before)、后置通知(After)、返回通知(After-returning)和异常通知(After-throwing)等。

通过使用AOP,我们可以将与核心业务逻辑无关的横切关注点抽离出来,集中进行管理和维护。这样可以使核心业务逻辑更加清晰,避免代码重复,提高代码的可维护性和可重用性。

在Java Spring框架中,AOP的实现使用了动态代理和元数据两种方式。动态代理可以在运行时动态地生成代理对象,实现对连接点的拦截和处理。元数据则是通过配置文件或注解等方式来定义切面和切点的规则和行为。

其关系图如下

 2.Aop中的作用范围,以及实际在企业中的开发背景

2.1作用范围

应用于各种类型的应用程序和业务领域

在实际的企业开发中,AOP常用于大型应用程序和分布式系统中。它可以提供跨模块和跨层的横切功能,帮助解决模块之间的耦合性和复杂性问题。通过将横切关注点的代码抽离到切面中,可以提高代码的可维护性和可重用性,减少重复代码的编写,提高开发效率

2.2在企业开发的作用

1. 事务管理:AOP可以通过在方法调用前后进行事务的开启和提交/回滚,简化了事务管理的代码和配置。它可以将事务管理关注点从业务逻辑中抽离出来,使开发者能够专注于业务逻辑的实现,提高了事务管理的灵活性和可维护性。

2. 安全控制:AOP可以在方法调用前进行权限校验和身份认证,实现安全控制的功能。通过将安全控制的逻辑与业务逻辑分离,可以确保安全控制的一致性和可扩展性。

3. 日志记录:AOP可以在方法调用前后进行日志记录,帮助开发者追踪和调试代码。它可以通过在切面中插入日志记录的逻辑,实现日志记录的统一管理,避免了在多个方法中重复编写日志记录代码的问题。

4. 性能统计:AOP可以监控方法的执行时间和资源消耗,实现性能统计的功能。通过将性能统计的逻辑与业务逻辑分离,可以更好地了解和优化系统的性能。

5. 异常处理:AOP可以在方法调用发生异常时进行异常处理,例如记录日志、发送警报等。它可以集中管理异常处理的逻辑,提高系统的健壮性和可靠性。

企业开发中,AOP通常与其他技术和框架一起使用,例如Spring框架、Hibernate框架、Spring MVC框架等。它可以与这些框架无缝集成,共同实现业务逻辑和非功能性需求的开发

3.Aop 在使用中必有名词

连接点(Joinpoint):程序执行过程中明确的点,如方法的调用,或者异常的抛出.

目标(Target):被通知(被代理)的对象

通知(Advice):在某个特定的连接点上执行的动作,同时Advice也是程序代码的具体实现,例如一个实现日志记录的代码(通知有些书上也称为处理)

代理(Proxy):将通知应用到目标对象后创建的对象(代理=目标+通知),请注意:只有代理对象才有AOP功能,而AOP的代码是写在通知的方法里面的

切入点(Pointcut):多个连接点的集合,定义了通知应该应用到那些连接点。

 (也将Pointcut理解成一个条件 ,此条件决定了容器在什么情况下将通知和目标组合成代理返回给外部程序)
适配器(Advisor):适配器=通知(Advice)+切入点(Pointcut)

4.spring中Aop的特点
 


二.实际使用场景5大通知(这里小编以书籍管理系统为例)

实例展示

解决的问题:解决了需求的改变,造成了原有没必要改变的代码,需要去改变它;

比如:书籍的增删改,本身只需要完成增删改的功能即可,这是如果需要添加日志功能,那么需要在原有的代码基础上,去修改添加日志功能,受牵连的方法就三个(add/edit/del)了;

实在不能够理解小编举这样一个例子:比如说明星和经纪人! 明星就是目标,给明星找电影拍,经纪人就是通知。经纪人有了安排,明星和经纪人一起就是代理!

1.前置通知

定义:

用于在目标方法执行前执行一些额外的逻辑。具体来说,前置通知会在目标方法执行之前被触发,它可以用来进行一些准备工作、参数校验、日志记录等操作

 通过建立一个接口来模拟方法

package com.zking.aop.biz;

public interface IBookBiz {
	// 购书
	public boolean buy(String userName, String bookName, Double price);

	// 发表书评
	public void comment(String userName, String comments);
}

建立接口后实现方法 

 通过控制台的输出方式模拟购书,
通过控制台的输出方式模拟发表书评

 

package com.zking.aop.biz.impl;

import com.zking.aop.biz.IBookBiz;
import com.zking.aop.exception.PriceException;

public class BookBizImpl implements IBookBiz {

	public BookBizImpl() {
		super();
	}

	public boolean buy(String userName, String bookName, Double price) {
		// 通过控制台的输出方式模拟购书
		if (null == price || price <= 0) {
			throw new PriceException("book price exception");
		}
		System.out.println(userName + " buy " + bookName + ", spend " + price);
		return true;
	}

	public void comment(String userName, String comments) {
		// 通过控制台的输出方式模拟发表书评
		System.out.println(userName + " say:" + comments);
	}

}

 实现前置通知方法

在这里,可以获取到目标类的全路径及方法及方法参数,然后就可以将他们写到日志表里去

package com.zking.aop.advice;

import org.springframework.aop.MethodBeforeAdvice;

import java.lang.reflect.Method;
import java.util.Arrays;


/**
 * 买书、评论前加系统日志
 * @author Administrator
 *
 */
public class MyMethodBeforeAdvice implements MethodBeforeAdvice {

	@Override
	public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
		//在这里,可以获取到目标类的全路径及方法及方法参数,然后就可以将他们写到日志表里去
		String target = arg2.getClass().getName();
		String methodName = arg0.getName();
		String args = Arrays.toString(arg1);
		System.out.println("【前置通知:系统日志】:"+target+"."+methodName+"("+args+")被调用了");
	}
}

 

 

打印结果 

 2.后置通知

定义:

后置通知(After Advice):在一个连接点完成之后(例如,一个方法执行之后)执行的通知。无论连接点是否成功完成,后置通知都会执行。

 实现后置通知方法

 

package com.zking.aop.advice;

import org.springframework.aop.AfterReturningAdvice;

import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * 买书返利
 * @author Administrator
 *
 */
public class MyAfterReturningAdvice implements AfterReturningAdvice {

	@Override
	public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {
		String target = arg3.getClass().getName();
		String methodName = arg1.getName();
		String args = Arrays.toString(arg2);
		System.out.println("【后置通知:买书返利】:"+target+"."+methodName+"("+args+")被调用了,"+"该方法被调用后的返回值为:"+arg0);
	

	}

}

打印结果 

3. 环绕通知

定义:


环绕通知(Around Advice):环绕通知围绕在一个连接点的整个调用过程中执行。可以理解h

 实现环绕通知方法

package com.zking.aop.advice;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

import java.util.Arrays;

/**
 * 环绕通知
 * 	包含了前置和后置通知
 * 
 * @author Administrator
 *
 */
public class MyMethodInterceptor implements MethodInterceptor {

	@Override
	public Object invoke(MethodInvocation arg0) throws Throwable {
		String target = arg0.getThis().getClass().getName();
		String methodName = arg0.getMethod().getName();
		String args = Arrays.toString(arg0.getArguments());
		System.out.println("【环绕通知调用前:】:"+target+"."+methodName+"("+args+")被调用了");
//		arg0.proceed()就是目标对象的方法
		Object proceed = arg0.proceed();
		System.out.println("【环绕通知调用后:】:该方法被调用后的返回值为:"+proceed);
		return proceed;
	}

}

 

打印结果 

 4.异常通知

定义:


异常通知(After Throwing Advice):在方法抛出异常后执行的通知。可以用于捕获方法抛出的特定异常,并采取相应的处理措施。
 

 5.过滤通知

定义:

过滤通知(Before Advice):在一个连接点之前执行的通知。可以在方法执行前做一些准备工作,如参数检查、权限验证等。
 

 

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

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

相关文章

BOXTRADE-天启量化分析平台 系统功能预览

BOXTRADE-天启量化分析平台 系统功能预览 系统功能预览 1.登录 首页 参考登录文档 2. A股 行情与策略分析 2.1 A股股票列表 可以筛选和搜索 2.2 A股行情及策略回测 2.2.1 行情数据提供除权和前复权&#xff0c;后复权数据&#xff1b;外链公司信息 2.2.2 内置策略执行结果…

使用 PyTorch 进行高效图像分割:第 2 部分

一、说明 这是由 4 部分组成的系列的第二部分&#xff0c;旨在使用 PyTorch 中的深度学习技术从头开始逐步实现图像分割。本部分将重点介绍如何实现基线图像分割卷积神经网络&#xff08;CNN&#xff09;模型。 图 1&#xff1a;使用 CNN 运行图像分割的结果。按从上到下的顺序…

建筑结构健康监测系统,解锁建筑安全监测新模式

随着现代建筑技术的发展&#xff0c;高层、超高层、大型公共建筑以及桥梁等复杂结构的数量不断增加&#xff0c;对建筑结构监测的要求也日益迫切。万宾建筑结构健康监测系统通过先进的传感技术和和数据分析技术来持续监测建筑的结构健康&#xff0c;这种监测的目的是可以识别建…

Cat(4):API介绍—Transaction

1 基本用法 Transaction 适合记录跨越系统边界的程序访问行为,比如远程调用&#xff0c;数据库调用&#xff0c;也适合执行时间较长的业务逻辑监控&#xff0c;Transaction用来记录一段代码的执行时间和次数。 现在我们的框架还没有与dubbo、mybatis做集成&#xff0c;所以我…

网络协议的定义、组成和重要性?

什么是网络协议&#xff1f; 网络协议是在计算机网络中&#xff0c;用于规定通信实体之间进行数据传输和通信的规则集合。网络协议涵盖了各种通信细节&#xff0c;包括数据包格式、错误处理、数据传输速率等&#xff0c;是用于分组交换数据网络的一种协议&#xff0c;其任务仅…

Linux:shell脚本:基础使用(4)《正则表达式-grep工具》

正则表达式定义&#xff1a; 使用单个字符串来描述&#xff0c;匹配一系列符合某个句法规则的字符串 正则表达式的组成&#xff1a; 普通字符串: 大小写字母&#xff0c;数字&#xff0c;标点符号及一些其他符号 元字符&#xff1a;在正则表达式中具有特殊意义的专用字符 正则表…

发掘Win10神奇工具:计划任务程序的自动化魔力

在Windows 10系统中&#xff0c;隐藏着许多不为人知的神奇工具&#xff0c;您了解多少呢&#xff1f;想象一下&#xff0c;如果有一种工具&#xff0c;能够像机器人一样在您设定的时间自动执行各种任务&#xff0c;您会不会觉得它是一件非常实用的利器&#xff1f;今天&#xf…

算法通关村第4关【黄金】| 表达式问题

1. 计算器问题 思路&#xff1a;此题不考虑括号和负数情况&#xff0c;单纯使用栈即可解决。注意的是数字可能是多位数需要保留完整的num&#xff0c; 保留数字的前缀符号&#xff0c;当碰到加号&#xff0c;存进去&#xff1b;当碰到减号&#xff0c;存相反数进去&#xff1b;…

【算法系列篇】双指针

文章目录 前言什么是双指针算法1.移动零1.1 题目要求1.2 做题思路1.3 Java代码实现 2.复写零2.1 题目要求2.2 做题思路2.3 Java代码实现 3.快乐数3.1 题目要求3.2 做题思路3.3 Java代码实现 4.盛最多水的容器4.1 题目要求4.2 做题思路4.3 Java代码实现 5.有效三角形的个数5.1 题…

Windows 10 20H2升级至Windows 11

关于Windows 10 20H2和21H1版本结束支持 在Windows 10中&#xff0c;20H2版本是Windows 10的第十个主要更新。此次升级于2020年10月20日上线。 2020年10月更新中的显著变化包括开始菜单、Microsoft Edge的改进、新的可自定义体验、通知体验的增强等。 然而&#…

Windows防火墙屏蔽恶意TCP连接

关闭所有软件(except 安全)&#xff0c;wireshark抓包 set filtertcp&#xff0c;抓取所有tcp包&#xff0c; 抓包文件导出为tcp.txt 过滤出ip address 去掉文件头尾&#xff0c;执行以下程序获得ip address #cut_file.py def copy_first_10_chars(input_file, output_fil…

展会预告 | 图扑与您相约用友 2023 全球商业创新大会

为汇聚商业智慧&#xff0c;释放企业潜能&#xff0c;深入推动企业数智化转型升级&#xff0c;创新客户价值&#xff0c;让数智化在更多的企业成功&#xff0c;由用友主办的“2023 全球商业创新大会”&#xff0c;将于本月 8 月 18 日至 20 日&#xff0c;在上海市“国家会展中…

IT运维:使用数据分析平台监控深信服防火墙(进阶)

概述 本文主要在原文档基础上&#xff0c;进行了字段抽取规则、图表的优化。 字段抽取&#xff1a;原文档使用正则的方式&#xff0c;创建了多个视图&#xff0c;本文将改为正则键值的抽取方式&#xff0c;并介绍键值抽取的适用场景 图表的优化&#xff1a;原文使用多为简单的…

56.linux 进程管理命令和用户管理命令

目录 一、进程管理命令 1.ps 2.pstree 3.kill 4.pkill 5.&后台运行程序 6.jobs 7.fg bg 8.top 二、用户管理命令 1.系统存储用户信息的文件 2.添加新用户 3.修改用户密码 4.删除用户 一、进程管理命令 1.ps 用于查看当前系统中运行的进程信息。它可以…

thinkphp开发的在线学习培训考试模拟考试做题练习系统带商城功能证书管理课程系统

thinkphp开发的在线学习培训考试模拟考试做题练习系统带商城功能证书管理课程系统 1、做题界面 2、前端UI的展示 3、带商城购物功能

springboot 通过博途获取plc点位的数据

springboot 通过博途获取plc点位的数据 maven依赖<dependency><groupId>com.github.dathlin</groupId><artifactId>HslCommunication</artifactId><version>3.6.0</version> </dependency>这个版本尽量是新版本&#xff0c;不…

微服务-GateWay(网关)

所谓网关是什么意思&#xff1f; 相当于就是你们小区家的保安&#xff0c;进出小区都得获得保安的同意&#xff0c;守护你们小区的生命财产健康&#xff0c;网关也是如此&#xff0c;对每个请求都严格把关&#xff0c;将合法的或者是获得权限的请求进入服务器 网关的功能&…

【CTF-web】bugku-成绩查询(sql注入)

题目链接&#xff1a;https://ctf.bugku.com/challenges/detail/id/84.html 判断注入点 查看网页源码可知输入数据通过POST发送到index.php并显示出查询结果&#xff0c;可能需要sql注入。 如上图所示&#xff0c;当id为1时返回名字为“龙龙龙”的成绩单。 再测试&#xff0c…

创建第一个任务源码解析

经过上面的操作以后我们就可以启动第一个任务了&#xff0c;函数 prvStartFirstTask()用于启动第一 个任务&#xff0c;这是一个汇编函数&#xff0c;函数源码如下&#xff1a; __asm void prvStartFirstTask( void ) { PRESERVE8 ldr r0, 0xE000ED08 ;R00XE000ED08 (1) ldr r…

Go语言GIN框架安装与入门

Go语言GIN框架安装与入门 文章目录 Go语言GIN框架安装与入门1. 创建配置环境2. 配置环境3. 下载最新版本Gin4. 编写第一个接口5. 静态页面和资源文件加载6. 各种传参方式6.1 URL传参6.2 路由形式传参6.3 前端给后端传递JSON格式6.4 表单形式传参 7. 路由和路由组8. 项目代码mai…