SpringAOP的概述与实现

news/2024/5/3 3:36:47/文章来源:https://blog.csdn.net/weixin_47514459/article/details/126909391

目录

SpringAOP的概述

什么是AOP

AOP能干什么

AOP的特点

AOP底层实现

AOP基本概念

连接点

切入点

通知

切面

目标对象

织入

引入

谈谈你对AOP的理解?

SpringAOP的实现

依赖引用

spring.xml配置

注解实现

1.定义切面 设置通知

2.开启aop

3.测试

xml实现

1.写切面类

2.配置aop相关配置

3.测试


SpringAOP的概述

什么是AOP

        Aspect oriented Programing面向切面编程,相比较oop 面向对象编程来说,Aop关注的不再是程序代码中某个类,某些方法,而aop考虑的更多的是一种面到面的切入,即层与层之间的一种切入,所以称之为切面。如:大家吃的汉堡(中间夹肉)。

AOP能干什么

        AOP主要应用于日志记录,性能统计,安全控制,事务处理等方面,实现公共功能性的重复使用。

AOP的特点

  1. 降低模块与模块之间的耦合度,提高业务代码的聚合度(高内聚低耦合)
  2. 提高了代码的复用性
  3. 提高系统的扩展性。(高版本兼容低版本)
  4. 可以在不影响原有的功能基础上添加新的功能

AOP底层实现

        动态代理(JDK与CGLIB)

AOP基本概念

连接点

        被拦截到的每个点,spring中指被拦截到的每一个方法,spring aop一个连接点即代表一个方法的执行。

切入点

        对连接点进行拦截的定义(匹配规则定义规定拦截哪些方法,对哪些方法进行处理),spring有专门的表达式语言定义。
 

通知

        拦截到每一个连接点即(每一个方法)后所要做的操作

  1. 前置通知(前置增强)- before()执行方法前通知
  2. 返回通知(返回增强)- afterReturn方法正常结束返回后的通知
  3. 异常抛出通知(异常抛出增强)- afetrThrow()
  4. 最终通知- after无论方法是否发生异常,均会执行该通知。
  5. 环绕通知– around包围一个连接点(join point)的通知,如方法调用。这是最强大的一种通知类型。环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。

切面

        切入点与通知的结合,决定了切面的定义,切入点定义了要拦截哪些类的哪些方法,通知则定义了拦截过方法后要做什么,切面则是横切关注点的抽象,与类相似,类是对物体特征的抽象,切面则是横切关注点抽象。

目标对象

        被代理的对象

织入

        将切面应用到目标对象并生成代理对象的这个过程即为织入

引入

        在不修改原有应用程序代码的情况下,在程序运行期为类动态添加方法或者字段的过程称为引入

谈谈你对AOP的理解?

  1. Aop是面向切面编程,Aop关注的不再是程序代码中某个类,某些方法,而是层与层之间的一种切入
  2. 应用于日志记录,性能统计,安全控制,事务处理等方面,实现公共功能性的重复使用
  3. 作用:降低模块与模块之间的耦合度,提高业务代码的聚合度,提高了代码的复用性,可以在不影响原有的功能基础上添加新的功能
  4.   动态代理(JDK与CGLIB)实现AOP

SpringAOP的实现

依赖引用

<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.6</version>
</dependency>

spring.xml配置

xmlns:aop="http://www.springframework.org/schema/aop"http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd

注解实现

1.定义切面 设置通知

package com.lsf.aspect;import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;/*** 定义切面*  定义 切入点 与 通知 的结合**/@Component  //将该类交给IOC实例化
@Aspect   //声明此类为切面类
public class LogCut {/*** 定义切入点*      通过Pointcut定义规则*      @Pointcut("execution(* com.lsf.service.*.*(..))")   com.lsf.service下所有方法*      例:*      1,拦截所有方法*      @Pointcut("execution(* *(..))")**      2,拦截所有公共的set方法方法*      @Pointcut("execution(public set*(..))")***  **  **/@Pointcut("execution(* com.lsf.service.*.*(..))")public void cut(){}/*** 前置通知,引用在切入点*  在目标方法调用前*/@Before(value = "cut()")public void before(){System.out.println("这是一个前面通知");}/*** 返回通知,引用在切入点*  在目标方法无异常返回时输出*/@AfterReturning(value = "cut()")public void afterReturn(){System.out.println("返回通知");}/*** 最终通知,引用在切入点*  在目标方法是否异常 ,都输出*/@After(value = "cut()")public void after(){System.out.println("最终通知");}/*** 异常通知,引用在切入点*  在目标方法发生异常时 ,都输出*/@AfterThrowing(value = "cut()",throwing = "e")public void afterThrow(Exception e){System.out.println("异常通知:异常原因:  ");}/*** 环绕通知,引用在切入点*  在目标方法发生异常时 ,都输出*/@Around(value = "cut()")public Object around(){System.out.println("前置通知");Object result = null;try {System.out.println("返回通知");}catch (Exception e){e.printStackTrace();System.out.println("异常通知");}catch (Throwable throwable){throwable.printStackTrace();}finally {System.out.println("最终通知");}return result;}}

2.开启aop

  <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

3.测试

package com.lsf;import com.lsf.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Starter {public static void main(String[] args) {ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");UserService userService = (UserService) ac.getBean("userService");userService.test();}}

 

xml实现

1.写切面类

package com.lsf.aspect;import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;/*** 定义切面*  定义 切入点 与 通知 的结合**/@Component  //将该类交给IOC实例化
@Aspect   //声明此类为切面类
public class LogCutxml {/*** 定义切入点*/public void cut(){}/*** 前置通知,引用在切入点*  在目标方法调用前*/public void before(){System.out.println("这是一个前面通知");}/*** 返回通知,引用在切入点*  在目标方法无异常返回时输出*/public void afterReturn(){System.out.println("返回通知");}/*** 最终通知,引用在切入点*  在目标方法是否异常 ,都输出*/public void after(){System.out.println("最终通知");}/*** 异常通知,引用在切入点*  在目标方法发生异常时 ,都输出*/public void afterThrow(Exception e){System.out.println("异常通知:异常原因:  ");}/*** 环绕通知,引用在切入点*  在目标方法发生异常时 ,都输出*/public Object around(){System.out.println("前置通知");Object result = null;try {System.out.println("返回通知");}catch (Exception e){e.printStackTrace();System.out.println("异常通知");}catch (Throwable throwable){throwable.printStackTrace();}finally {System.out.println("最终通知");}return result;}}

2.配置aop相关配置

 <!--aop相关配置--><aop:config><!--  aop切面--><aop:aspect ref="logCutxml"><!--定义aop切入点--><aop:pointcut id="cut" expression="execution(* com.lsf.service..*.*(..))"/><!--配置前置通知指定前置通知方法名︰并引用切入点定义--><aop:before method="before" pointcut-ref="cut" /><!--配置返回通知指定返回通知方法名并引用切入点定义--><aop:after-returning method="afterReturn" pointcut-ref="cut"/><!--配置异常通知指定异常通知方法名并引用切入点定义--><aop:after-throwing method="afterThrow" throwing="e" pointcut-ref="cut" /><!-- 配置最终通知指定最终通知方法名并引用切入点定义--><aop:after method="after" pointcut-ref="cut" /><!--配置指定环绕通知方法名并引用切入点定义--><aop:around method="around" pointcut-ref="cut"/></aop:aspect>
</aop:config>

3.测试

package com.lsf;import com.lsf.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Starter {public static void main(String[] args) {ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");UserService userService = (UserService) ac.getBean("userService");userService.test();}}

 

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

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

相关文章

金仓数据库KingbaseES客户端编程开发框架-MyBatis(2. 概述 3. MyBatis配置说明)

2. 概述 MyBatis 是一款优秀的持久层框架&#xff0c;它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息&#xff0c; 将接口和 Java 的 POJOs(Plain Old Ja…

Sourcemap 配置详解

前言 之前在脚手架工具内整合将sourcemap上传sentry能力的时候&#xff0c;考虑bundle分割对.map文件关联的限制&#xff1a;比如TerserWebpackPlugin&#xff08;JS压缩&#xff09;只对 devtool 选项的 source-map&#xff0c;inline-source-map&#xff0c;hidden-source-m…

后端研发工程师面经——JAVA语言

文章目录2. JAVA语言2.1 面向对象的三大特性2.2 JAVA异常2.2.1 异常产生的原因2.2.2 异常的分类2.2.3 异常的处理方式2.3 序列化和反序列化2.3.1 概念2.3.2 JAVA中的序列化和反序列化2.3.3 序列化和反序列化的接口2.3.4 Serialization接口详解2.3.5 Externalizable接口详解2.3.…

3D建模师做多了女人会不会找不到老婆?次世代美少女战士建模流程讲解

什么是次世代&#xff1f; 次世代是个舶来语&#xff0c;“次世代游戏”指代和同类游戏相比下更加先进的游戏&#xff0c;即“下一代游戏”。 次世代是利用高模烘焙的法线贴图回帖到低模上&#xff0c;让低模在游戏引擎里可以及时显示高模的视觉效果。模型面数比较高&#xf…

算法 - 计数排序(Counting_Sort)

目录 引言&#xff1a; 学习&#xff1a; 什么是计数排序&#xff08;Counting_sort&#xff09;&#xff1f; 定义&#xff1a; 算法思想&#xff1a; 排序过程&#xff1a; Step 1 &#xff1a; Step 2 &#xff1a; Step 3 &#xff1a; Step 4 : Step 5 &…

单片机项目式实训总篇

采取新方法&#xff0c;让自己尽快变强&#xff0c;为了更好的再次见面。停止大脑内斗。 总学习目标&#xff1a;&#xff08;完成后此文字支持跳转&#xff09; 基础知识 端口操作 显示 高级输入 时间控制 综合 Flag: 一周破解C51程序 学习内容&#xff1a; 了解单片…

DeepExploit——当Metasploit遇上机器学习

Metasploit Meets Machine Learning 文章目录Metasploit Meets Machine Learning1. Metasploit准备1.1 与外部项目的合作1.1.1 启用RPC API1.1.2 使用RPC API操作Metasploit2. 创建机器学习模型2.1 DQN2.2 A3C2.2.1 CartPole2.2.2 分布式学习机制3. 深度利用3.1 代理任务3.2 当…

JVM——GC垃圾回收机制

文章目录JVM——GC垃圾回收机制一、如何判断哪些对象应该被回收——对象判活算法引用计数算法可达性分析算法引用最终判定二、对象应该怎么被回收——垃圾回收算法分代收集理论标记-清除算法标记-复制算法标记-整理算法三、内存对象什么时候被回收——触发条件年轻代GC(Minor G…

如期而至的SVN服务器迁移引来一个大瓜XAMPP

文章目录前言方案评估前奏XAMMP搭建svn服务准备软件包安装必要环境和工具安装xampp运行xampp编辑xampp访问xampp安装subversion安装svnmanager创建svn仓库目录修改配置文件为svnmanager创建MySQL用户重启xammp服务访问svnmanager登录svnmanager可能遇到的错误查看服务器目录信息…

10 nginx 中的 slab

前言 这里主要是描述 nginx 中的 slab 内存分配相关 slab 在很多的地方都有使用, 比如 linux, nginx, netty 等等 主要的作用是 内存管理, 复用 简略 nginx 中的 slab 的流程 # slab relatedvoid* poolPtr malloc(2048);ngx_slab_pool_t *pool (ngx_slab_pool_t *)poo…

Pytorch深度学习——线性回归实现 04(未完)

文章目录1 问题假设2 步骤3 学习使用Pytorch的API来搭建模型3.1 nn.Model3.2 优化器类3.3 评估模式和训练模式3.4 使用GPUdata和item的区别1 问题假设 假设我们的基础模型就是y wxb&#xff0c;其中w和b均为参数&#xff0c;我们使用y 3x0.8来构造数据x、y,所以最后通过模型…

0.django部署(基础知识)

我们前面的代码都是在我们自己的电脑&#xff08;通常是Windows操作系统&#xff09;上面运行的&#xff0c;因为我们还处于开发过程中。 当我们完成一个阶段的开发任务后&#xff0c;就需要把我们开发的网站服务&#xff0c;给真正的用户使用了。 那就需要我们的 网站 部署在…

【二次分配问题】基于遗传算法 (GA)、粒子群优化 (PSO) 和萤火虫算法 (FA) 求解二次分配( QAP)问题(MATLAB 实现)

目录 1 概述 3 Matlab代码及文章阅读 4 运行结果 4.1 萤火虫算法 4.2 粒子群优化算法 4.3 遗传算法 5 参考文献 1 概述 目前&#xff0c;该问题已经得到深入的研究&#xff0c;进化策略(evolutionstrategies)、遗传算法(genetic algorithms)、遗传规划(geneticprogramm…

警惕利用「以太坊合并」的 3 种骗局

原文作者&#xff1a;茉莉 距离以太坊合并还有不到 6 小时&#xff0c;这条被视作下一代互联网 Web3.0 底层基础设施的区块链网络将彻底改变共识机制&#xff0c;从工作量证明的 PoW 机制转向权益证明的 PoS。 在合并即将到来前&#xff0c;去中心化安全网络市场 PolySwarm 创…

各语言转wasm-js调用

起源是 我司应该是抄袭某家player , 也用wasm做的 , 所以我也研究一下 关于标题 我估计需要大家一起完善了 , 我只会讲一下 go c 别的都不会 webassembly( wasm ) 可以编译的如图 我想起我这边应用啊 也就无非播放器~~ 本地文件压缩啊加密啊或直接就上传了, 或者在操作数据…

RestHighLevelClient创建索引时报错[299 Elasticsearch-7.12.1

RestHighLevelClient创建索引时报错[299 Elasticsearch-7.12.1出现原因 : 这是因为在使用create方法时 , 会有两个选择 , 其中一个已经过时了 client.indices().create(request, RequestOptions.DEFAULT); 其中的create方法 , 有两个版本 , 有一个显示已经过时了 , 两个方法虽然…

蜂蜜什么时候喝,才可以获得蜂蜜更大的好处?真可以治疗咳嗽?

中秋节刚过去不久&#xff0c;家里面的礼品多的是不是可以开超市了?中国人讲究一个“礼”字&#xff0c;逢年过节、探望故友病友手里不带点东西就会难受。中秋节这样带有美好祝愿的节日自然也是中国人送礼的最佳时间之一。 ​ 编辑切换为居中 添加图片注释&#xff0c;不超过…

Google Chrome Privacy Sandbox All In One

Google Chrome Privacy Sandbox All In OneGoogle Chrome Privacy Sandbox All In OneGoogle Chrome 隐私沙盒chrome://settings/privacySandbox With Privacy Sandbox trials, sites can deliver the same browsing experience using less of your info. That means more priv…

需要在html中加CSS,怎么加

在html中加CSS有三种方式 一种是直接写到标签上的style属性里面 <divid"mydiV"style"width:200px;border:1pxsolid#f00;margin:0;"></div> 一种是写到head标签里面的style标签里面 <styletype"text/css"> #mydiV{ width:2…

C++ 01 内存模型

内存分区的示意图。一般内存主要分为&#xff1a;代码区、常量区、静态区&#xff08;全局区&#xff09;、堆区、栈区这几个区域。 什么是代码区、常量区、静态区&#xff08;全局区&#xff09;、堆区、栈区&#xff1f; 代码区&#xff1a;存放程序的代码&#xff0c;即CPU执…