Spring Aop到底有什么用处?

2023-05-16

假如没有aop,在做日志处理的时候,我们会在每个方法中添加日志处理,比如

1

但大多数的日子处理代码是相同的,为了实现代码复用,我们可能把日志处理抽离成一个新的方法。但是这样我们仍然必须手动插入这些方法。

2

但这样两个方法就是强耦合的,假如此时我们不需要这个功能了,或者想换成其他功能,那么就必须一个个修改。

通过动态代理,可以在指定位置执行对应流程。这样就可以将一些横向的功能抽离出来形成一个独立的模块,然后在指定位置插入这些功能。这样的思想,被称为面向切面编程,亦即AOP。

3

为了在指定位置执行这些横向的功能,需要知道指定的是什么地方

4

例如上图,方法级别的aop实现,在一个程序执行链条中,把method2称为切点,也就是说在method2执行时会执行横切的功能,那么是在method2之前还是之后呢,又是执行什么呢?这些都由advice(通知)来指定。advice有5种类型,分别是

通知类型简介
Before(前置通知)目标方法调用之前执行
After(后置通知)目标方法调用之后执行
After-returning(返回通知)目标方法执行成功后执行
After-throwing(异常通知)目标方法抛出异常后执行
Around(环绕通知)相当于合并了前置和后置

把切点和通知合在一起就是切面了,一个切面指定了在何时何地执行何种方法。在spring aop中如此定义这个切面:

@Aspect
@Component
public class UserAspect {

    @Before("execution(* com.aop.service.impl.UserServiceImpl.login(..))")
    public void loginLog(){
        System.out.println("user login");
    }

}

使用注解@Aspect将某个特定的类声明为切面,这样,该类下的方法就可以声明为横向的功能点后插入到指定位置。使用execution表达式声明在这个切点,格式如下 5

第一个位置指定了方法的返回值,*号代表任意类型的返回值,然后是所在的类和方法名,*号同样代表任意,就是该类中任意的方法,在上一个例子中方法名是login,则是指定了该类中的login方法。然后最后一个参数是方法入参,因为java中支持重载,所以这个参数可以帮助你更精确的进行定位。两点表示任意参数类型。这样,execution表达式告诉了程序该在何地执行通知。而被诸如@Before注解修饰的方法就是通知的内容,也就是做什么。

至此,我们就可以使用spring aop,但是还有两点需要得到注意

  1. 将切面类声明为一个bean
  2. 切点指定的方法所在的类也同样需由spring注入才能生效
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Aop到底有什么用处? 的相关文章

  • 基于Redis的布隆过滤器的实现

    项目简介 包含一个基于Redis的布隆过滤器的实现 xff0c 以及应用到Scrapy中的Demo 地址 xff1a BloomFilterRedis 布隆过滤器 网上有很多介绍 xff0c 推荐 数学之美 xff0c 介绍的很详尽 xff
  • 如何利用vs2010(适用其他版本)创建一个c语言程序

    如何利用vs2010创建你的第一个c语言程序 1 打开vs 2010 xff0c 选中新建项目 2 选中win32控制台应用程序 xff0c 起个项目名 不加 c xff0c 自定义路径 3 下一步 4 选中空项目 xff0c 下一步 5
  • Django之后台上传图片(二十二)

    上传图片 在python中进行图片操作 xff0c 需要安装包PIL pip install Pillow 61 61 3 4 1 在Django中上传图片包括两种方式 xff1a 在管理页面admin中上传图片 自定义form表单中上传图
  • #华为mate8公开版解bl锁避免踩雷的事项

    华为mate8公开版解bl锁避免踩雷的注意事项 最近一个朋友 xff08 64 djkaguya xff09 出于某些原因需要将他此型号的备用机解bl锁来迁移服务 xff0c 此篇文章用来记述他在折腾过程中总结出的注意事项 整体流程 1 华
  • qt 修改背景颜色 的几种方法

    按钮方式切换一种颜色 span class token keyword void span MainWindow span class token operator span span class token operator span s
  • 什么是底层驱动程序

    底层驱动是程序以访问底层硬件的形式实现人机交互 xff0c 驱动程序和应用程序之间需要实现相应的信息交互 xff0c 一方面 xff0c 应用程序通过对驱动程序发送相应的指令 xff0c 实现 硬件控制的动作指令 xff0c 另一 方面 x
  • Spring Security 401 问题解决

    背景 xff1a 微服务接口调用的时候报错 xff0c 原来有一个rest服务用的不多 xff0c 平时用的都是一些基础的服务 xff0c 然后客户需要我们开放一个外部接口给他们 xff0c 然后我寻思着就在这里面写接口 然后调用的时候就报
  • ubuntu源不可用

    如果使用ubuntu系统时 xff0c 发现之前的源不可用 xff0c 使用命令 sudo gedit span class token operator span etc span class token operator span ap
  • keras UpSampling2D/3D

    UpSampling2D 看tf文档中的解析 xff1a tf keras layers UpSampling2D xff1a Upsampling layer for 2D inputs 在一个2D输入中进行上采样操作 xff0c 其实就
  • C#winform实现窗口及窗口内容自动缩放(代码已封装)

    c 窗体实现等比例缩小放大 代码如下 原出处为某问答中看到的 摘录下来 以免遗忘 原文地址已附上 如有侵权请联系我 本文仅供学习交流 按我个人理解 setControl函数应当使用多线程加速 本人只是新手 就不画蛇添足了 欢迎各位大佬补正
  • 在移植boa服务器的过程中出现boa:not found问题以及移植cgic库编译时出现arm-linux-gcc-g命令未找到错误

    1 嵌入式web服务器移植的过程在网上很多资源的 xff0c 我在这就不再赘述了 xff0c 我就简单说下一个对于新手来说很头疼的问题 xff01 xff01 移植boa服务器的时候 xff0c 所有的编译工作以及移植工作全部做完了 xff
  • 详解JavaScript异步与回调

    一 前言 在学习本文内容之前 xff0c 我们必须要先了解异步的概念 xff0c 首先要强调的是异步和并行有着本质的区别 并行 xff0c 一般指并行计算 xff0c 是说同一时刻有多条指令同时被执行 xff0c 这些指令可能执行于同一CP
  • Linux上VNC 启动和关闭 ( 解决 Ubuntu16.04 sncserver连接出现Timed out waiting for a response from the computer)

    原文 https blog csdn net russle article details 4757888 整体思路 xff1a 查看vncserver端口 是否开启 xff08 手动kill vncserver进程有坑 xff0c 有时再
  • Ubuntu各个版本下载

    官网 xff1a https www ubuntu com download desktop 没找到历史版本 xff0c 且下载速度很慢 在网易镜像站下载ubuntu xff1a 网址 xff1a http mirrors 163 com
  • C++ vector 内存分配与回收机制

    最近开始更加深入的学习C 43 43 xff0c 发现了很多以前没注意到但是很重要的知识点 这篇文章主要说vector内存机制和效率问题 1 vector内存增长 vector所有的内存相关问题都可以归结于它的内存增长策略 vector有一
  • [简约webAPI]php连接MSsql server的五种方法总结

    参考了下php官方手册总结了五种PHP连接MSsql server的方法 mssql 系列函数 sqlsrv 系列函数 odbc方式连接sqlserver PDO方式连接sqlserver COM方式连接 参考php手册 xff0c 对ph
  • idea中activiti的属性设置界面不见了

    idea中activiti的属性设置界面不见了 解决方法 xff1a 1 关闭bpmn文件 xff0c 重新打开 xff0c 点击流程图编辑器 xff0c 就会出现相关节点的属性了 2 http www yayihouse com yayi
  • Spring 中最常用的 11 个扩展点

    目录 1 自定义拦截器 2 获取Spring容器对象 2 1 BeanFactoryAware接口 2 2 ApplicationContextAware接口 3 全局异常处理 4 类型转换器 5 导入配置 5 1 普通类 5 2 配置类
  • 前端页面播放直播流flv

    1 html代码 lt DOCTYPE html gt lt html gt lt head gt lt meta http equiv 61 34 Content Type 34 content 61 34 text html chars
  • java分片处理List集合数据

    java分批次处理List集合数据 解决方法 xff1a 1 用法 以下代码假如datas有10000个元素 xff0c 每次分批处理1000个元素 xff0c 那么以下datasub stream forEach会执行10次 List l

随机推荐