详解原生Spring框架下的类切入点表达式与切入点函数

 

 😉😉 学习交流群:

✅✅1:这是孙哥suns给大家的福利!

✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料

🥭🥭3:QQ群:583783824   📚📚  工作微信:BigTreeJava 拉你进微信群,免费领取!

🍎🍎4:本文章内容出自上述:Spring应用课程!💞💞

💞💞5:以上内容,进群免费领取呦~ 💞💞💞💞

一:类切入点表达式概念

        假设我需要把一个类当中的所有的方法定义为切入点,这样我们可以使用这个类切入点,类切入点指定类为切入点,只不过是这样的一个称呼。
        所有的额外功能还是加在了这个类的全部的方法上,这样的形式是包+类:
        详细的切入点配置如下,测试结果不贴出来了,和其他的一样没啥区别。

1:某一个确定类加入额外功能

        * com.aaa.bbb.impl.*(..)  :类中的所有方法都加入了额外功能,这是第一种语法形式。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"><bean id="userService" class = "com.pactera.spring.proxy.UserServiceImpl"/><bean id="orderService" class = "com.pactera.spring.proxy.OrderServiceImpl"/>
<!--    <bean id="before" class="com.pactera.spring.dynamic.Before"/>--><bean id = "around" class = "com.pactera.spring.dynamic.Around"/><aop:config><!--这个标签就是用来定义切入点的,expression这个是切入点表达式,代表所有的方法都要加上这个额外功能--><!--所有的方法,都作为切入点作为额外功能。--><aop:pointcut id="pc" expression="execution(* com.pactera.spring.proxy.UserServiceImpl.*(String,..))"/><!--组装,组长的目的就是为了把切入点与额外的功能进行整合--><aop:advisor advice-ref="around" pointcut-ref="pc"/></aop:config>
</beans>

        指定特定类作为切入点,额外功能加入的自然这个类当中的所有的方法都会加上对应的额外功能的。

2:不同包下的同名的类作为类切入点

* *.UserServiceImpl.*(..) -->这样写是不可以的,一个*只能匹配一级包,一般我们的类不会写在com包下的,这样写是有问题的。

如果是多级包应该是这样写:*..表达的就是一级包乃至多级包。* *..UserServiceImpl.*(..):这样写就能匹配多级目录下的这个类了。任何包下的这个类都作为切入点。

3:某个包下的所有的方法作为切入点

我想为所有的某个包下的所有的方法添加切入点:

* com.alibaba.a.*.*(..) -->匹配这个包下的所有类的所有的方法。
注意上边这样写只能在a的包下,不能在a的子包下,子包下是不能被匹配到的。
* com.alibaba..a.*.*(..) -->匹配a包,包括a子包下的所有的类。

将来我们的使用切入点的时候,包的切入点的使用价值更高。使用更加频繁

二:切入点函数

        切入点函数的作用就是用执行切入点表达式的函数        
        excution:最为重要的一个切入点函数,也是功能最全的。执行方法切入点表达式,也可以执行类切入点表达式,也可以执行包切入点表达式
        弊端:excution执行切入点表达式的时候,书写麻烦,比如:execution(* com.alibaba.proxy..*.*(..);这样写起来很麻烦,spring为我们提供了其他的切入点函数,其他的切入点函数只是起到了简化execution切入点函数的作用,功能还是一样的的,本质上是没有任何区别的,简化的事execution书写的复杂度,但是功能上是完全一致的。

1:args函数

        作用:主要用于函数(方法的)参数的匹配,我们研究下这个意思。

        需求1:方法的切入点其他我不关系,参数必须是两个String的方法作为切入点

        execution(* *(String,String)) -->使用excution这样写
        args(String,String) -->使用args这样写。
        代码和测试结果如下:

    <aop:config><!--这个标签就是用来定义切入点的,expression这个是切入点表达式,代表所有的方法都要加上这个额外功能--><!--所有的方法,都作为切入点作为额外功能。-->
<!--        <aop:pointcut id="pc" expression="execution(* com.pactera.spring.proxy.UserServiceImpl.*(String,..))"/>    --><aop:pointcut id="pc" expression="args(String,String))"/><!--组装,组长的目的就是为了把切入点与额外的功能进行整合--><aop:advisor advice-ref="around" pointcut-ref="pc"/></aop:config>

        测试执行结果: 

    /** @Target: 用于测试* login(String,String)这个切入点表达式_测试多个切入点表达形式* @Author: DaShu* @Date: 2021/6/21 20:53* @Result: 这个切入点定义到了login方法,并且具有两个参数,并且两个参数都是String类型;*/@Testpublic void test6(){ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext3.xml");UserService userService = (UserService)ctx.getBean("userService");userService.login("zhangjie","zhangjie");//...........................这里是额外功能...............................//UserServiceImpl.login//-------------------------------这里还是额外功能----------------------------------------}

2:whthin这个函数

        作用:主要用于类、包切入点的表达式的匹配。

        需求:切入点想选择UserServiceImpl这一个类,不关心包
        execution(* *..UserService.*(..)) -->使用execution方式这样写。
        within(*..UserServiceImpl) -->这个不关系包只关心类的书写方法。
        execution(* com.baizhiedu.proxy..*.*(..)) --使用execution这样写。
        within(com.baizhiedu.proxy..*)
        其实这种简化的写法就是在execution函数选择了一些东西,省略了一些东西。

3:@Annotation

        作用:为具有特定注解的方法加入额外功能,这个是最核心的功能

    <aop:config><!--这个标签就是用来定义切入点的,expression这个是切入点表达式,代表所有的方法都要加上这个额外功能--><!--所有的方法,都作为切入点作为额外功能。-->
<!--        <aop:pointcut id="pc" expression="execution(* com.pactera.spring.proxy.UserServiceImpl.*(String,..))"/>    --><aop:pointcut id="pc" expression="@annotation(com.pactera.spring.annotation.Log)"/><!--组装,组长的目的就是为了把切入点与额外的功能进行整合--><aop:advisor advice-ref="around" pointcut-ref="pc"/></aop:config>
/*** @Auther: DaShu* @Date: 2021/6/15 18:58* @Description:*/
public class UserServiceImpl implements UserService{@Override@Logpublic void register(User user) {//这代表的事业务运算+dao的调用,额外功能不写在这里边。System.out.println("UserServiceImpl.register");}@Overridepublic boolean login(String name,String password) {System.out.println("UserServiceImpl.login");return true;}
}

三:切入点函数的逻辑运算

        切入点函数的逻辑运算值得是整合多个切入点函数一起配合工作,进而完成更为复杂的需求
逻辑运算指的就是整合多个切入点函数的,让他们一起起作用,进而满足可能会遇到的更为复杂的需求,基本操作

1:and  与操作

        案例1:方法得叫login,方法参数参数是两个String类型即可。
        execution(* login(String,String))  -->使用原生execution的书写方式
        execution(* login(..))  and  args(String,String)  --使用切入点函数的逻辑运算。
        两个表达式必须同时满足,两者取的是交集

        注意:与操作不能用于同种类型的切入点函数!

2:or  或操作

        两个切入点满足之一即可进行。

3:!非操作

    <aop:config>
<!--        <aop:pointcut id="pc" expression="@annotation(com.spring.annotation.Log) "/>--><aop:pointcut id="pc" expression="@annotation(com.spring.annotation.Log) and !execution(* com.spring.proxy.UserServiceImpl.re*(..))"/><aop:pointcut id="pc01" expression="@annotation(com.spring.annotation.Log) and !execution(* com.spring.proxy.UserServiceImpl.register(..))"/><aop:advisor advice-ref="around" pointcut-ref="pc"/></aop:config>
    @Testpublic void test1() {ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");UserService userService = (UserService) ctx.getBean("userService");userService.register(new User());userService.register01(new User());//UserServiceImpl.register//UserServiceImpl.register01}@Testpublic void test2() {ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");UserService userService = (UserService) ctx.getBean("userService");userService.login("sun", "123456");//...........................这里是额外功能1...............................//UserServiceImpl.login//-------------------------------这里还是外功能2----------------------------------------}

这个非操作使用的是!这个符号。

四:Spring动态代理开发总结

        为什么使用Spring动态代理开发?

        动态代理开发就是代理开发,作用就是通过代理类对目标类或者叫做原始类增加额外的功能,好处就利于原始类的维护,这里代理类的好处,具体到Spring的动态代理的来讲呢,一共是四步,Spring创建目标对象,Spring创建额外功能对象,定义切入点,整合切入点和额外功能。

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

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

相关文章

126. 单词接龙 II

126. 单词接龙 II 需要注意的是&#xff0c;由于要找最短路径&#xff0c;连接 dot 与 lot 之间的边就不可以被记录下来&#xff0c;同理连接 dog 与 log 之间的边也不可以被记录。这是因为经过它们的边一定不会是最短路径。因此在广度优先遍历的时候&#xff0c;需要记录的图…

分享88个节日PPT,总有一款适合您

分享88个节日PPT&#xff0c;总有一款适合您 88个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1mfLrdlB9Y1jqz2vkVIwBNA?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

Linux部分基础指令讲解

目录 1.echo指令 2.more指令 3.less指令&#xff08;重要&#xff09; 4.head指令 5.tail指令 6.管道| 7.时间相关的指令 8.cal指令 9.find指令 10.grep指令 1.echo指令 我们先看效果 如图所示我们可以看到显示器显示出了hellow world和hellow这两句话&#xff0c;我们的echo的…

超分辨率重建

意义 客观世界的场景含有丰富多彩的信息&#xff0c;但是由于受到硬件设备的成像条件和成像方式的限制&#xff0c;难以获得原始场景中的所有信息。而且&#xff0c;硬件设备分辨率的限制会不可避免地使图像丢失某些高频细节信息。在当今信息迅猛发展的时代&#xff0c;在卫星…

【EI会议征稿】第四届生物信息学与智能计算国际学术研讨会(BIC 2024)

第四届生物信息学与智能计算国际学术研讨会&#xff08;BIC 2024&#xff09; 2024 4th International Conference on Bioinformatics and Intelligent Computing 2024年第四届生物信息学与智能计算国际学术研讨会 &#xff08;BIC 2024&#xff09;将定于2024年1月26-28日在…

Golang数据类型(数字型)

Go数据类型&#xff08;数字型&#xff09; Go中数字型数据类型大致分为整数&#xff08;integer&#xff09;、浮点数&#xff08;floating point &#xff09;和复数&#xff08;Complex&#xff09;三种 整数重要概念 整数在Go和Python中有较大区别&#xff0c;主要体现在…

C++的explicit和隐式转换

隐式转换是指在某些情况下&#xff0c;编译器会自动进行类型转换&#xff0c;将一种类型的值转换为另一种类型&#xff0c;以满足表达式的要求。这种转换是隐式进行的&#xff0c;不需要显式地调用转换函数或构造函数。 int a 5; double b a; // int 到 double 的隐式转换上…

利用 FormData 实现文件上传、监控网路速度和上传进度

利用 FormData 实现文件上传 基础功能&#xff1a;上传文件 演示如下&#xff1a; 概括流程&#xff1a; 前端&#xff1a;把文件数据获取并 append 到 FormData 对象中后端&#xff1a;通过 ctx.request.files 对象拿到二进制数据&#xff0c;获得 node 暂存的文件路径 前端…

【c++|SDL】开始使用之---demo

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 SDL 记录 1. hello word #include<SDL2/SDL.h>SDL_Window* g_pWindow 0; SDL_Renderer* g_pRenderer 0;int main(int argc, char* args[]) {//…

黄金比例设计软件Goldie App mac中文版介绍

Goldie App mac是一款测量可视化黄金比例的工具。专门为设计师打造&#xff0c;可以帮助他们在Mac上测量和可视化黄金比例&#xff0c;从而轻松创建出完美、平衡的设计。 Goldie App mac体积小巧&#xff0c;可以驻留在系统的菜单栏之上&#xff0c;随时提供给用户调用。 拥有独…

Dart编程基础 - 一种新的编程语言

Dart编程基础 – 一种新的编程语言 Dart Programming Essentials - A New Type of Programming Language By JacksonML Dart is a client-optimized language for fast apps on any platform From dart.dev 在1999年之前&#xff0c;和我一样对计算机技术感兴趣的伙伴们&…

面试篇spark(spark core,spark sql,spark 优化)

一&#xff1a;为什么学习spark&#xff1f; 相比较map-reduce框架&#xff0c;spark的框架执行效率更加高效。 mapreduce的执行框架示意图。 spark执行框架示意图 spark的执行中间结果是存储在内存当中的&#xff0c;而hdfs的执行中间结果是存储在hdfs中的。所以在运算的时…

基于通义千问和向量数据构建问答知识库

参考&#xff1a;Java从0到1构建基于ChatGPT向量数据库的检索增强生成模型RAG-02 - 知乎 (zhihu.com) 1、先开通 阿里云的向量检索服务 如何开通向量检索服务并创建API-KEY_向量检索服务-阿里云帮助中心 (aliyun.com) 按流程申请 最后需要申请API-KEY 安装DashVector SDK M…

Nacos2.x配置中心源码分析

概述 源码注释参考 git 仓库&#xff0c;对应流程图后续补充&#xff1b; 启动 nacos nacos 启动类&#xff1a; // com.alibaba.nacos.NacosSpringBootApplication(scanBasePackages "com.alibaba.nacos") ServletComponentScan EnableScheduling public class…

关于安科瑞AAFD-40型故障电弧探测器的功能介绍-安科瑞 蒋静

1 概述 故障电弧探测器&#xff08;以下简称探测器&#xff09;对接入线路中的故障电弧&#xff08;包括故障并联电弧、故障串联电弧&#xff09;进行有效的检测&#xff0c;当检测到线路中存在引起火灾的故障电弧时&#xff0c;可以进行现场的声光报警&#xff0c;并将报警信…

单片机实验(三)

前言 实验一&#xff1a;利用定时器T1的中断控制P1.7引脚输出音频信号&#xff0c;启动蜂鸣器发出一段熟悉的与众不同的具有10个音节的音乐音频。 实验二&#xff1a;使用定时器/计数器来实现一个LCD显示年、月、日、星期 、时、分、秒的电子表&#xff0c;要求时和分可以方便…

Vmware17虚拟机安装windows10系统

不要去什么系统之家之类的下载镜像&#xff0c;会不好安装&#xff0c;镜像被魔改过了&#xff0c;适合真实物理机上的系统在PE里安装系统&#xff0c;建议下载原版系统ISO文件 安装vmware17pro 下载地址https://dwangshuo.jb51.net/202211/tools/VMwareplayer17_855676.rar 解…

04.PostgreSQL是如何实现隔离级别的?

PostgreSQL是如何实现隔离级别的&#xff1f; 事务有哪些特性&#xff1f; 事务看起来感觉简单&#xff0c;但是要实现事务必须要遵守 4 个特性&#xff0c;分别如下&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;一个事务中的所有操作&#xff0c;要么…

Elasticsearch(ES)概述

文章目录 一.什么是Elasticsearch?1.正向索引和倒排索引2.Mysql和ES的概念对比3.安装elasticsearch、kibana 二.IK分词器三.索引库操作四.文档操作五.RestClient操作索引库1.初始化RestClient2.创建索引库3.删除索引库4.判断索引库是否存在 六.RestClient操作文档1.新增文档2.…

Elasticsearch 优化查询中获取字段内容的方式,性能提升5倍!

1、背景 集群配置为&#xff1a;8 个 node 节点&#xff0c;16 核 32G&#xff0c;索引 4 分片 1 副本。应用程序的查询逻辑是按经纬度排序后找前 200 条文档。 1、应用对查询要求比较高&#xff0c;search 没有慢查询的状态。 2、集群压测性能不能上去&#xff0c;cpu 使用未打…