Spring5应用之AOP切入点详解

作者简介:☕️大家好,我是Aomsir,一个爱折腾的开发者!
个人主页:Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客
当前专栏:Spring5应用专栏_Aomsir的博客-CSDN博客

文章目录

  • 前言
  • 切入点详解
    • 切入点表达式
      • 方法切入点表达式
        • 注意点
      • 类切入点表达式
      • 包切入点表达式
    • 切入点函数
      • execution函数
      • args函数
      • within函数
      • @annotation函数
    • 切入点函数逻辑运算
      • and
      • or
  • 总结
  • 参考文献

前言

在前面的几篇文章里,我们已经探讨了AOP的四步编程以及Spring所提供的额外方法接口。今天,我们要探讨的是另一个核心概念—— 切入点。切入点决定了在何处插入这些额外的功能。但如之前文章所述,我们的切入点表达式相当粗糙,将额外的功能直接加入了所有类和方法中。这种做法明显不够精细,因为并不是每个原始方法都需要加入如日志、性能监测之类的额外功能

切入点详解

切入点就是这样的execution(* * (..)),这个切入点表达式就是将额外功能加在所有的原始方法上。这个切入点里面它里面有切入点函数切入点表达式

切入点表达式

方法切入点表达式

切入点表达式是AOP中一个关键的概念,用于定义哪些方法需要加入额外的功能。理解其语法和含义对于编写精确的切入点至关重要,如下图结合描述

  • 第一个* : 它代表返回值类型(包括修饰符)。使用*意味着匹配所有的返回值类型。如果你只想为返回int或void的方法添加额外的功能,你可以相应地替换它。
  • 第二个* : 这代表方法名(包括包、类)。使用*会匹配类中的所有方法。如果你想特定某个方法(如login)加入额外的功能,那么你可以替换它为login。
  • 括号中的 …: 这部分代表参数列表。…表示匹配任意数量、任意类型的参数。如果你想特定某种参数类型和数量的方法加入额外功能,如login(String, String),那么可以明确地指出这两个参数的类型。

然后我为public boolean login(String name, String password)方法加入额外功能,切入点表达式就是boolean login(String, String)。测试结果也验证了这一点:只有login方法被增强,而register方法并没有被影响。这也说明了切入点表达式的强大和灵活性,使我们能够精确地控制哪些方法需要被增强,而哪些不需要
在这里插入图片描述
在这里插入图片描述

<aop:config><!--定义切入点,将额外方法加在所有类的方法上--><aop:pointcut id="pc" expression="execution(boolean login (String, String))"/><!--组装,将额外功能与切入点进行组装整合--><aop:advisor advice-ref="arround" pointcut-ref="pc" />
</aop:config>
public class TestProxy {@Testpublic void test2() {ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");UserService userService = (UserService) ctx.getBean("userService");userService.login("Aomsir", "123456");userService.register(new User());}
}
注意点
  • 方法名写成find*代表加在所有方法名以find开头的方法上
  • 返回值以及方法参数类型如果不在java.lang下则需要写全类名
  • 参数类型写成(String, ..)代表第一个参数必须为String,后面的参数不作要求
  • public * *(..)代表加在所有类的public修饰的方法上

类切入点表达式

级别的切入点可以看作是针对方法的切入点的一种扩展。它的表达方式非常直观,例如,* com.aomsir.service.UserService.*(..)。这个表达式指向com.aomsir.service.UserService这个类中的所有方法,不论它们的返回类型和参数是什么。换句话说,这个类中的每一个方法都将加入额外功能。

如果我们稍作变动,·* *.UserService.*(..),则目标变为了项目中任意一级包下名为UserService的类的所有方法。而表达式* *..UserService.*(..)则更为通用,它针对项目中的任意包(及其子包)下名为UserService的类的所有方法。

这些表达式的灵活性为我们提供了在不同层级和范围内插入额外功能的能力,使得我们可以更精确地控制何处加入这些功能

包切入点表达式

包切入点,正如其名,是专门用来定位特定包中的类和方法。实际上,我们在之前的类切入点描述中已经接触过它。通过包切入点,我们可以更精确地决定在哪些包中的类或方法上添加额外的功能。

例如,使用* com.aomsir.service.*.*(..)这个表达式,我们可以将额外的功能加入到com.aomsir.service包下的所有类和方法中。而如果我们希望仅针对某个子包如com.aomsir.service.UserService,那么可以使用* com.aomsir.service.UserService.*.*(..)

这种方式尤其适合于大型项目,其中可能存在多个模块或功能区块,每个区块都有其自己的包。通过包切入点,我们可以为特定模块的所有类和方法统一地添加相同的额外功能,如日志记录或安全检查,而不必为每个类或方法单独定义切入点。

这种方法提供了一个高效的方式来组织和管理代码的横切关注点,确保项目结构的清晰和维护的便捷性

切入点函数

切入点函数在AOP中起着至关重要的作用,用于解析和执行切入点表达式,从而决定哪些方法或类应加入额外的功能。以execution(* * (..))为例,其中的execution()正是一个切入点函数,专门用于匹配方法的执行。

除了execution()外,AOP还提供了一系列其他的切入点函数,以满足不同的匹配需求:

  • args(): 根据方法参数类型进行匹配。
  • within(): 针对特定的类型或包进行匹配。
  • @annotation(): 根据方法上的注解来确定匹配。
    每个切入点函数都有其独特的应用场景和匹配规则。了解并正确使用这些函数可以使我们在定义AOP增强时更加精确和高效

execution函数

execution()是AOP中最常用且功能最为强大的切入点函数。它的灵活性使其可以应用于匹配方法、类甚至是包级别的切入点表达式。例如,使用execution(* com.aomsir.service..*(..)),我们可以匹配com.aomsir.service包及其子包下的所有方法。

然而,这种强大的功能性也带来了一些复杂性。execution()的表达式结构可能相对繁琐,尤其是当我们需要定义更加细致的匹配规则时。尽管如此,它的强大和灵活性使得我们可以精确地控制增强的应用位置,为AOP提供了坚实的基础

args函数

args()是AOP中的另一个重要切入点函数,它专门用于根据方法的参数类型进行匹配。例如,通过使用args(String, String),我们可以轻松地为所有具有两个String类型参数的方法添加额外功能。

相比之下,要达到同样的效果,execution()函数的表达式会稍显复杂,形如execution(* *(String, String))。虽然功能上等同,但args()提供了一个更为简洁直观的写法。

这种简化在定义切入点时降低了复杂度,使得我们可以更轻松地捕捉目标方法,并为之添加相应的增强功能。

within函数

within()是AOP中的一个核心切入点函数,主要用于针对类和包的匹配。使用within(),我们可以轻松地为特定类或特定包下的所有类定位切入点。

within(* *..UserService)为例,这个表达式会匹配项目中任意包(及其子包)下名为UserService的类中的所有方法。

这种方式让我们能够方便地为特定的类或整个包下的类一次性定义相同的切入点,实现代码的集中管理和优化

@annotation函数

@annotation()是AOP中的一个独特切入点函数,专门用于匹配带有指定注解的方法。通过这个函数,我们可以为那些带有特定注解的方法集中地添加额外功能。

例如,表达式@annotation(com.aomsir.annotation.Log)旨在匹配所有带有com.aomsir.annotation.Log注解的方法。这意味着,只要方法上标注了Log注解,它就会被自动加入额外的功能。

这种方法为我们提供了一个简洁且高度灵活的方式,使得我们可以基于注解来组织和管理切入点,进而实现代码的模块化和易于维护。

切入点函数逻辑运算

切入点函数的逻辑运算使我们能够组合多个切入点函数,满足更为复杂和特定的匹配需求。这种整合方式允许我们在定义切入点时使用逻辑组合,如“与”、“或”和“非”,确保只有满足多重条件的方法或类被选中,从而实现更精细的控制

and

and操作是逻辑中的“与”运算,在切入点表达式中,它用于组合多个条件,确保所有指定的条件都被满足。例如,当我们想匹配一个带有两个String类型参数的login方法时,可以直接使用execution(* login(String, String))。但我们也可以利用and运算将两个表达式结合起来,如execution(* login(…)) and args(String, String)。

值得注意的是,and操作不能用于连接两个同类型的切入点函数,确保组合的表达式既有意义又避免冲突

or

or操作是逻辑中的“或”运算,在切入点表达式中,它允许我们匹配满足任一条件的方法。例如,若我们想同时匹配login和register方法,我们需要使用or操作。表达式为:execution(* login(..)) or execution(* register(..))

与and操作不同,or操作允许连接两个同类型的切入点函数,使得我们可以灵活地组合多个条件,满足广泛的匹配需求

总结

本篇文章深入探讨了AOP中切入点的各个方面。在切入点表达式部分,我们详述了方法、类以及包的匹配方式。这些表达式极为实用,只需根据业务需求进行灵活组合,即可轻松定义所需的切入点。而在切入点函数部分,我们讨论了几种主要的切入点函数及其逻辑组合。当这些函数与切入点表达式共同作用时,我们可以实现更为精确和细致的匹配,确保AOP的增强功能能够被恰当地应用于项目中

参考文献

  • 孙哥孙帅suns说Spring5~学不会Spring? 因为你没找对人
  • Spring官方文档

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

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

相关文章

简单三步 用GPT-4和Gamma自动生成PPT PDF

1. 用GPT-4 生产PPT内容 我想把下面的文章做成PPT&#xff0c;请你给出详细的大纲和内容 用于谋生的知识&#xff0c;学生主要工作是学习&#xff0c;成年人的工作是养家糊口&#xff0c;这是基本的要求&#xff0c;在这之上&#xff0c;才能有更高的追求。 不要短期期望过高…

C#(CSharp)入门教程

目录 C#的第一个程序 变量 折叠代码 变量类型和声明变量 获取变量类型所占内存空间&#xff08;sizeof&#xff09; 常量 转义字符 隐式转换 显示转换 异常捕获 运算符 算术运算符 布尔逻辑运算符 关系运算符 位运算符 其他运算符 字符串拼接 …

计算机图像处理-高斯滤波

高斯滤波 高斯滤波是一种线性平滑滤波&#xff0c;适用于消除高斯噪声&#xff0c;广泛应用于图像处理的减噪过程。通俗的讲&#xff0c;高斯滤波就是对整幅图像进行加权平均的过程&#xff0c;每一个像素点的值&#xff0c;都由其本身和邻域内的其他像素值经过加权平均后得到…

Ubuntu部署运行ORB-SLAM2

ORB-SLAM2是特征点法的视觉SLAM集大成者&#xff0c;不夸张地说是必学代码。博主已经多次部署运行与ORB-SLAM2相关的代码&#xff0c;所以对环境和依赖很熟悉&#xff0c;对整个系统也是学习了几个月&#xff0c;一行行代码理解。本次在工控机上部署记录下完整的流程。 ORB-SLA…

koa基础应用

不要把koa想得太复杂&#xff0c;他就是一个Node框架而已。 在本地应用安装好Node和koa后&#xff0c;先实现一下简单的服务app.js&#xff0c;代码如下&#xff1a; const Koa require(koa) const app new Koa(); app.use(async (context) > {context.body hello Koa …

企业风险管理策略终极指南

企业风险管理不一定是可怕的。企业风险管理是一个模糊且难以定义的主题领域。它涵盖了企业的多种风险和程序&#xff0c;与传统的风险管理有很大不同。 那么&#xff0c;企业风险管理到底是什么&#xff1f;在本文中&#xff0c;我们将确定它是什么&#xff0c;提出两种常见的…

B058-SpringBoot

目录 springboot概念与作用入门案例springboot运行方式热部署配置文件Profile多环境支持整合测试-springboot-testSpringboot-web1.返回json数据2.返回页面&#xff08;模板技术&#xff09;thymeleaf1.导入thymeleaf依赖2.模板文件3.controller4.启动类 SSM整合1.导包2.项目目…

机器人中的数值优化|【四】L-BFGS理论推导与延伸

机器人中的数值优化|【四】L-BFGS理论推导与延伸 往期内容回顾 机器人中的数值优化|【一】数值优化基础 机器人中的数值优化|【二】最速下降法&#xff0c;可行牛顿法的python实现&#xff0c;以Rosenbrock function为例 机器人中的数值优化|【三】无约束优化&#xff0c;拟牛…

让大脑自由

前言 作者写这本书的目的是什么&#xff1f; 教会我们如何让大脑更好地为自己工作。 1 大脑的运行机制是怎样的&#xff1f; 大脑的基本运行机制是神经元之间通过突触传递信息&#xff0c;神经元的兴奋和抑制状态决定了神经网络的运行和信息处理&#xff0c;神经网络可以通过…

使用Qt验证RGB格式

下面我们用不同的颜色来绘制一块矩形区域&#xff0c;来对比学习RGB颜色。 一片漆黑的黑色 黑色在RGB中是三个颜色分量都是0。也就是没有颜色。 下面我们绘制一个水平100个像素&#xff0c;垂直200个像素的矩形区域&#xff0c;颜色设置为黑色。 #ifndef MAINWINDOW_H #def…

SpringBoot整合阿里云OSS文件存储解决方案

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Sp…

Dink进阶之路

1、环境变量 cat /etc/profile #flink需要 export HADOOP_CLASSPATHhadoop classpath export HADOOP_CONF_DIR/etc/hadoop/conf2、Flink配置 2.1、flink-conf.yaml jobmanager.rpc.address: node-146 jobmanager.rpc.port: 6123 # 设置jobmanager总内存 jobmanager.memory.…

clip代码安装实操

CLIP模型及代码地址&#xff1a;GitHub - openai/CLIP: Contrastive Language-Image Pretraining 代码准备环境 先创建一个anaconda虚拟环境&#xff0c;包含python3.7版本&#xff0c;将该环境命名为clip。成功。 &#xff08; pytorch1.7.1 所需 python 版本 >3.6&…

React 入门笔记

前言 国庆值班把假期拆了个稀碎, 正好不用去看人潮人海, 趁机会赶个晚集入门一下都火这么久的 React 前端技术. 话说其实 n 年前也了解过一丢丢来着, 当时看到一上来就用 JS 写 DOM 的套路直接就给吓退了, 扭头还去看 Vue 了&#x1f923;, 现在从市场份额来看, 确实 React 还…

抓包习讯云院校数据通过PHP解析导入数据库

前言 最近&#xff0c;打卡APP需要这个数据&#xff0c;通过抓包后发现这个数据是固定的&#xff0c;获取很简单&#xff0c;但是数据太多&#xff0c;手动导入不显示&#xff0c;于是分析了json格式后果断通过脚本完成 【推荐】 《【MQTT】Esp32数据上传采集&#xff1a;最…

GitHub上有助于开发微信小程序的仓库

2023年9月30日&#xff0c;周六晚上 最近帮同学在GitHub找了一些开发小程序会用到的东西 目录 UI库WePY框架基于WePY框架的Demo微信小程序开发资源汇总 UI库 GitHub - Tencent/weui-wxss: A UI library by WeChat official design team, includes the most useful widgets/m…

CSS基础介绍2

CSS使用三种方式 方式1&#xff1a;在标签的style属性上设置CSS样式&#xff08;行内样式&#xff09; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>在标签的style属性上设置CSS样式</title>…

吉力宝:智能科技鞋品牌步力宝引领传统产业创新思维

在现代经济环境下&#xff0c;市场经济下产品的竞争非常的激烈&#xff0c;如果没有营销&#xff0c;产品很可能不被大众认可&#xff0c;酒香也怕巷子深&#xff0c;许多传统产业不得不面临前所未有的挑战。而为了冲出这个“巷子”&#xff0c;许多企业需要采用创新思维&#…

Sentinel学习(1)——CAP理论,微服务中的雪崩问题,和Hystix的解决方案 Sentinel的相关概念 + 下载运行

前言 Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 本篇博客介绍CAP理论&#xff0c;微…

Egg使用jwt拦截jtoken验证

安装 npm install egg-jwt注册插件 在config文件夹子下 plugin,js下 use strict;module.exports {//mysqlmysql: {enable: true,package: egg-mysql},//jwtjwt: {enable: true,package: egg-jwt} };使用中间件 在app文件下创建 middleware 文件夹 在middleware 文件下创建…