第二部分:AOP

news2024/11/25 5:56:40

一、AOP简介

AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构。

AOP是OOP(面向对象编程)的进阶版。

作用:在不改变原始设计的基础上为其进行功能增强。

spring理念:无侵入式。

 二、AOP入门实例

1、pom.xml导入坐标:注解开发(spring-context)、切面编程(aspectjweaver)

2、配置类SpringConfig 内添加注解@EnableAspectJAutoProxy                                                   (开启spring对AOP注解驱动支持)表示要注解开发AOP

3、通知类MyAdvice:定义通知(功能)、定义切入点(位置)定义切面(绑定通知和切入点)

@Component //定义通知类受spring容器管理(让spring加载此通知类)
@Aspect //定义当前类为切面类(让spring明白此类 是做AOP的)

//在此类定义通知(共性功能)
public class MyAdvice {
    //定义切入点(本质上就是确定要加功能的方法的准确位置)(
    // 依托一个不具有实际意义的方法进行,即无参无返回值,方法体无实际逻辑)
    @Pointcut("execution(void com.itheima.dao.BookDao.update())")
    private void pt(){}

    //将切入点(位置)和通知(功能)绑定
    @Before("pt()")

    //定义通知(本质就是要添加的功能)
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

三、AOP工作流程

springAOP本质:代理模式           

如果切入点能和我要造bean的那个类匹配上对应的方法,则造代理对象;否则造原始对象

打印对象的getClass()方法(如bookDao.getClass())就可以看见是代理对象还是原始对象

四、AOP切入点表达式

切入点定位到接口 & 实现类均可(但是写到实现类就紧耦合了,所以不写)

@Pointcut("execution(void com.itheima.BookDao.updata())")
@Pointcut("execution(void com.itheima.dao.impl.BookDaoImpl.updata())")

1、语法格式:

 2、通配符

 3、书写技巧

 五、AOP通知类型<5>

<AOP通知描述了要添加的共性功能,共性功能要添加到切入点的合适位置。>                                AOP通知共分为5种类型:

前置通知、后置通知、环绕通知(重点)、返回后通知(了解)、抛出异常后通知(了解)

注意:环绕通知对原始方法调用以后,原始方法的返回值可以接出来,最终还要手动给送回去。下文中环绕通知即为规范格式。

@Component //定义通知类受spring容器管理(让spring加载此通知类)
@Aspect //定义当前类为切面类(让spring明白此类 是做AOP的)

//在此类定义通知(共性功能)
public class MyAdvice {
    //定义切入点(本质上就是确定要加功能的方法的准确位置)(
    // 依托一个不具有实际意义的方法进行,即无参无返回值,方法体无实际逻辑)
    @Pointcut("execution(void com.itheima.dao.BookDao.update())")
    public void pt1(){}

    @Pointcut("execution(int com.itheima.dao.BookDao.select())")
    public void pt2(){}

    //将切入点(位置)和通知(功能)绑定
    @Before("pt1()")//前置通知
    public void before(){
        System.out.println("此处是增强添加的通知,并且是一个前置通知");
    }
    @After("pt1()")//后置通知
    public void after(){
        System.out.println("此处是增强添加的通知,并且是一个后置通知");
    }

    @Around("pt1()")//环绕通知
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("此处是增强添加的通知,并且是一个环绕通知");
        Object ret = pjp.proceed();
        System.out.println("此处是增强添加的通知,并且是一个环绕通知");
        return ret;
    }

剩下俩个为:
@AfterReturning("")
@AfterThrowing("")

 此处可以利用around对原始方法进行《隔离》!

六、万次执行效率测试

测试业务层:

切入点表达式要确定业务层

@Pointcut("execution(* com.itheima.dao.*.*())")
    public void pt1(){}

采用环绕通知获取执行万次的前后系统时间

 @Around("pt1()")
    public void method(ProceedingJoinPoint pjp) throws Throwable {
        //获取执行签名信息
        Signature signature = pjp.getSignature();
        //通过签名获取接口名
        String className = signature.getDeclaringTypeName();
        //通过签名获取方法名
        String methodName = signature.getName();

        long start = (int) System.currentTimeMillis();
        for(int i = 0; i < 10000;i++){
            pjp.proceed();//此处代表执行业务层一万次
        }
        long end = (int) System.currentTimeMillis();
        System.out.println("执行一万次" + className + "." + methodName +"--->" + (end - start) + "ms");

    }

七、AOP通知获取数据

AOP是对原始方法进行增强的,必然要知道原始方法的数据。

基本操作:在通知的方法的参数内加上接口,调用接口的方法来获取原始方法的参数。

获取的数据有三类:原始操作的参数、原始操作的返回值、原始操作的异常。

每种类型的数据只有五类通知的部分可以获取:

1、获取参数

获取的参数类型为数组;对于前置通知获取参数后,可以对数据检验错误、修改等操作。

 //将切入点(位置)和通知(功能)绑定
    //@Before("pt1()")//前置通知
    public void before(JoinPoint jp){
        System.out.println("此处是增强添加的通知,并且是一个前置通知");
        Object[] args = jp.getArgs();//此方法getargs获取参数是数组类型
        System.out.println(Arrays.toString(args));
    }
后置、环绕、、都一样。

2、获取返回值

@Around("pt1()")//环绕通知
public Object around(ProceedingJoinPoint pjp) throws Throwable {
    Object args[] = pjp.getArgs();
    return ret;

3、获取异常信息

    @AfterThrowing(value = "pt1",throwing = "t")
    public void afterThrowing(Throwable t){
        System.out.println("返回异常" + t);
    }
    //注意通知的方法的参数要和标签的参数一致

八、百度网盘粘贴:字符串匹配自动处理多余的空格

AOP增强

@Component
@Aspect
public class DataAdvice {
    //定义切入点
    @Pointcut("execution(boolean com.itheima.service.ResourcesService.openURL(..))")
    public void pt(){}

    @Around("pt()")
    public Object trimStr(ProceedingJoinPoint pjp) throws  Throwable{
        //提前获取参数 将参数修改后在传参给原始方法内
        Object args[] = pjp.getArgs();
        for (int i = 0; i < args.length; i++) {
            if(args[i].getClass().equals(String.class)){//判断是不是字符串类型
                args[i] = args[i].toString().trim(); //是字符串类型就trim
            }
        }
        Object ret = pjp.proceed(args);//将空格处理后的参数在传参给要执行的原始方法
        return ret;
    }
}

十一、AOP总结

回忆。

要会啥呢?

1、得知道pom.xml文件里面要配置spring-context依赖(spring注解开发)、aspectjweaver依赖(AOP注解和切入点表达式,AOP核心功能已经被加载到spring-context依赖了)

2、知道要在spring核心配置类中加载AOP

3、得知道在AOP配置类中加载扫描啥的 切入点表达式会写。@Pointcut(“”execution())

4、环绕通知@Around(“”)参数ProceedingJoinpoint pjp

要写固定的执行原始方法得到返回值Object ret = pjp.proceed(args); return ret;

以上这些都是固定的。

5、根据不同的需要,通知类里面的方法咋写就看自己的了。

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

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

相关文章

STM32入门——USART

江科大STM32学习记录 通信接口 通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统通信协议&#xff1a;制定通信的规则&#xff0c;通信双方按照协议规则进行数据收发 串口通信 串口是一种应用十分广泛的通讯接口&#xff0c;串口成本低、…

Web菜鸟教程 - Swagger实现自动生成文档

如果是一个人把啥都开发了&#xff0c;那用不到Swagger-UI&#xff0c;但一般情况是前后端分离的&#xff0c;所以就需要告诉前端开发人员都有哪些接口&#xff0c;传入什么参数&#xff0c;怎么调用&#xff0c;返回什么。有了Swagger-UI就能把这部分文档编写的业务给省去了。…

Wlan——CAPWAP隧道的建立过程

CAPWAP基本概念 CAPWAP全称为无线接入点的控制和配置协议&#xff08;Control And Provisioning of Wireless Access Points Protocol Specification&#xff09; CAPWAP协议主要作用 1、AP可以通过CAPWAP实现自动发现AC 2、AC通过CAPWAP协议对AP进行管理、业务配置下发 3…

一百五十二、Kettle——Kettle9.3.0本地连接Hive3.1.2(踩坑,亲测有效)

一、目的 由于先前使用的kettle8.2版本在Linux上安装后&#xff0c;创建共享资源库点击connect时页面为空&#xff0c;后来采用如下方法&#xff0c;在/opt/install/data-integration/ui/menubar.xul文件里添加如下代码 <menuitem id"file-openZiyuanku" label&…

CKEditor5 爬坑.

CKEditor5 爬坑 exportpdf.d.ts ChatGPT 推荐我使用CKEditor,确实比UEditor高不少档次。 但是如果你想使用控件中的 PDF导出,Word导入导出。 你可能需要三思。 因为其PDF导出是通过美国云服务的。 exportpdf.d.ts /*** license Copyright (c) 2003-2023, CKSource Holding sp.…

ROSpider机器人评测报告

ROSpider机器人评测报告 最近入手了一款ROSpider六足仿生机器人&#xff0c;ROSpider是一款基于ROS 操作系统开发的智能视觉六足机器人。 外观 外观上ROSpider六足机器人如同名字一样有六只机械腿&#xff0c;整体来看像一只六腿的蜘蛛。腿上的关节处用了明亮的橙黄色很是显…

小红书运营 公司账号怎么做?

大家好&#xff0c;我是网媒智星&#xff0c;今天跟大家讨论一下一个人如何运营公司小红书账号&#xff1f; 之前有位同事告诉我&#xff1a;“老板对小红书不太了解&#xff0c;所以我一个人负责整个新媒体部门的运营工作&#xff0c;包括小红书、公众号、微博和抖音。就像一个…

黑客必备的操作系统——kali linux安装

大家经常会在电视里面看到各种炫酷的黑客操作&#xff0c;那么黑客一般用什么操作系统呢&#xff1f;今天小训带大家来安装黑客必备的kali linux-2022操作系统&#xff0c;有兴趣的一起来学习下吧&#xff01; 1、安装前准备 1.1 VMware下载 VMware官网下载&#xff1a; ht…

租车服务小程序DIY,让你成为租车平台的主人

汽车租赁行业正迎来快速发展的时代&#xff0c;随着人们对出行方式需求的增加&#xff0c;汽车租赁成为了一种便捷、经济的选择。而随着移动互联网的普及&#xff0c;微信小程序成为了一种理想的平台&#xff0c;为汽车租赁企业打造一个高效的租车平台。 首先&#xff0c;我们需…

P1955 [NOI2015] 程序自动分析

题目 思路 第一眼&#xff1a;非常简单的并查集 看看标签 6 为什么离散化会WARE呢 首先&#xff0c;并查集是根据f数组来联系两点的&#xff0c;类似于f[x]y&#xff0c;但是在这个题中我们不能确定x是否为非负整数&#xff0c;而且x过大也会炸内存 那就加一个离散化吧 输入…

Linux服务使用宝塔面板搭建网站,通过内网穿透实现公网访问

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 前言 宝塔面板作为简单好用的服务器运维管理面板&#xff0c;它支持Linux/Windows系统&#xff0c;我们可用它来一键配置LAMP/LNMP环境、网站、数据库、FTP等&…

案例16 基于Spring Boot实现学生新增案例

基于Spring Boot实现学生新增。 1. 创建Spring Boot项目 创建Spring Boot项目&#xff0c;项目名称为case16-springboot-student01。 ​ 2. 设置项目信息 ​ 3. 选择依赖 选择Lombok ​ 选择Spring Web ​ 4. 设置项目名称 ​ 5. Maven依赖 <?xml version"1.0&qu…

SyntaxError: Cannot use import statement outside a module

node环境运行报错&#xff1a; 解决步骤&#xff1a; 1. npm init -y 2. 在 package.json 文件中加入一条&#xff1a;"type": "module", 3. 保存后再执行即可 附&#xff1a;最好是不要在node用import&#xff0c;否则需要上次配置 建议1&#xff1a;用re…

【网络】传输层——TCP(滑动窗口流量控制拥塞控制延迟应答捎带应答)

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《网络》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 上篇文章对TCP可靠性机制讲解了一部分&#xff0c;这篇文章接着继续讲解。 &#x1f3a8;滑动窗口 在…

手动实现线性回归例子

转自&#xff1a;https://www.cnblogs.com/BlairGrowing/p/15061912.html 刚开始接触深度学习和机器学习&#xff0c;由于是非全日制&#xff0c;也没有方向感&#xff0c;缺乏学习氛围、圈子&#xff0c;全靠自己业余时间瞎琢磨&#xff0c;犹如黑夜中摸索着石头过河。 本文…

探讨uniapp的数据缓存问题

异步就是不管保没保存成功&#xff0c;程序都会继续往下执行。同步是等保存成功了&#xff0c;才会执行下面的代码。使用异步&#xff0c;性能会更好&#xff1b;而使用同步&#xff0c;数据会更安全。 1 uni.setStorage(OBJECT) 将数据存储在本地缓存中指定的 key 中&#x…

Oracle切割字符串的方法,SQL语句完成。

Oracle用正则的方式循环切割字符串 需求&#xff1a;有一个这样子的 Str “‘CNJ-520-180500000001|CNJ-520-181200000001|CNJ-520-190300000001|CNJ-520-190100000001|CNJ-520-181200000002’” &#xff0c;然后我需要拿到每一个单号&#xff0c;每一个单号都要走一遍固定的…

基于K8S环境部署Dolphinscheduler及简单应用

一、Dolphinscheduler简介 Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景,提供了一个可视化操作任务、工作流和全生命周期数据处理过程的解决方案。 Apache DolphinScheduler 旨在解决复杂的大数据任务依赖关系,并为应用…

SOPC之NIOS Ⅱ遇到的问题

记录NIOS Ⅱ中遇到的报错 一、NIOS II中Eclipse头文件未找到 问题&#xff1a;Unresolved inclusion: "system.h"等 原因&#xff1a;编译器无法找到头文件所在路径 解决方法&#xff1a; 在文件夹中找到要添加的头文件&#xff0c;并记录下其路径&#xff0c;如…

8.14 作业

1. .text .globl _start_start:mov r0,#0x9mov r1,#0xfbl loop loop:cmp r0,r1beq stopsubhi r0,r1subls r1,r0mov pc,lr stop:b stop 2.实现1-100的和 .text .globl _start_start:mov r0,#0x1bl loop loop:cmp r0,#0x64bhi stopaddls r1,r0addls r0,#0x1mov pc,lr stop:b sto…