Spring Aop组成部分

Spring Aop

(Aspect orirnted Programming)面向切面编程,是对面向对象编程的一种补充,是一种编程思想,是对某一类的事情的集中处理。

比如用户登录状态的验证状态,在之前写servlet版本的博客系统,这里就有一个登录验证而且是在每一个页面都添加了一个登录验证,在使用Aop后,只需要写一个类就可以解决这个问题。

Aop组成

  1. 切面(Aspect

    定义的是事件,Aop实现了某个功能的集合。

    ex:用户登录校验

  2. 切点(Pointcut

    定义事件的规则。

    ex:定义用户登录拦截规则,那些接口判断用户登录权限

  3. 通知(Advice

    AOP具体的执行方法。

    • 前置通知
    • 后置通知
    • 环绕通知
    • 异常通知
    • 返回通知

    ex:获取用户登录信息,如果已经获取说明已经是登陆状态,否则未登录。

  4. 链接点(Jion Poit

    有可能触发切点的所有点,这个点可以是方法调用,也可以是抛出异常或者是修改字段。

    ex:所有接口

实现AOP步骤:

  1. 添加依赖

    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    
  2. 定义切面

    @Aspect //定义切面
    @Component
    public class UserAspect {}
    
  3. 定义切点

    @Aspect //定义切面
    @Component
    public class UserAspect {@Pointcut("execution(* com.example.demo.controller.UserController.*(..)))")//空方法,主要是一个标识作用public void pointcut(){}
    }
    

    定义目录语法格式是AspectJ支持三种通配符

    *:匹配任意字符,只可以匹配一个元素。

    ..:匹配任意字符,可以匹配多个元素,表示类时,必须和*联合使用。

    +:表示按照类型匹配指定所有类,必须跟在类的后面。如:com.java.Car+表示继承该类的所有方法

  4. 通知

    具体实现方法

    @RestController
    @RequestMapping("/user")
    public class UserController {@RequestMapping("/grtUser")public String getUser(){System.out.println("do getUser");return "get User";}@RequestMapping("/delUser")public String delUser(){System.out.println("do delUser");return "delUser";}
    }
    

    实现通知

    @Aspect //定义切面
    @Component
    public class UserAspect {@Pointcut("execution(* com.example.demo.controller.UserController.*(..)))")//切点,括号中填写目录名称,在执行时会自动扫描方法,这⾥使⽤ AspectJ 表达式语法public void pointcut(){//目标方法,这⾥是空方法,主要是一个标识作用}//前置通知@Before("pointcut()")public void doBefore(){System.out.println("执行了前置通知");}//后置通知@After("pointcut()")public void doAfter(){System.out.println("执行了后置通知");}//环绕通知@Around("pointcut()")public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("环绕通知之前");//执行目标方法Object object = joinPoint.proceed();System.out.println("环绕通知之后");return object;}@AfterReturning("pointcut()")public void doAfterReturning(){System.out.println("执行了返回方法");}@AfterThrowing("pointcut()")public void doAfterThrowing(){System.out.println("执行了抛出异常方法");}
    }
    

    四种通知方法:

    前置通知:在执行方法之前执行的方法

    后置通知:在执行完前面所有方法之后执行

    环绕通知:通知包裹内被通知的方法,在被通知的方法之后和调用之前执行的自定义的行为。

    返回通知:通知方法会在目标方法返回之后执行

    异常通知:通知方法会在目标方法抛出异常后执行

AOP动态代理(实现原理)

Spring 动态代理组成:

JDK Proxy ------》 代理对象必须实现接口,才可以使用 JDK Proxy

CGLIB ------》通过实现代理类的子类来实现动态代理------》注意:被final修饰的类是不能被代理的

课件

两个代理区别

  1. 来源不同 :JDK来源于Java本地资源,CGLib是第三方资源
  2. 实现不同 :JDK proxy 需要代理类实现接口才可以实现代理 CGLIB是通过实现代理类的子类来完成动态代理
  3. 性能不同 : JDK 7+ JDK proxy 性能高与CGlib 。

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

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

相关文章

模拟实现消息队列项目(系列4) -- 服务器模块(内存管理)

目录 前言 1. 创建MemoryDataCenter 2. 封装Exchange 和 Queue方法 3. 封装Binding操作 4. 封装Message操作 4.1 封装消息中心集合messageMap 4.2 封装消息与队列的关系集合queueMessageMap的操作 5. 封装未确认消息集合waitMessage的操作 6. 从硬盘中恢复数据到内存中 7. Memo…

ceph pg inconsistent修复(unexpected clone)

问题概述&#xff1a; ceph -s 显示pg 10.17 inconsistent 且命令ceph pg repair 10.17无法修复&#xff0c;/var/log/ceph/cep-osd.3.log报错内容如下&#xff1a; pg 10.17 osd [3,4] 权威副本osd&#xff1a;3 repair 10.17 10:e889b16a:::rbd_data.88033092ad95.00000000…

Linux 命令之 - scp(从远端机器拉取数据)

scp是secure copy的简写&#xff0c;用于在Linux下进行远程拷贝文件的命令&#xff0c;和它类似的命令有cp&#xff0c;不过cp只是在本机进行拷贝不能跨服务器&#xff0c;而且scp传输是加密的。 命令格式&#xff1a; scp [参数] [原路径] [目标路径]从本地服务器复制到远程…

面试攻略,Java 基础面试 100 问(一)

面向对象的特征有哪些方面? 抽象(Encapsulation)&#xff1a;封装的目的是为了保证变量的安全性&#xff0c;使用者不必在意具体实现细节&#xff0c;而只是通过外部接口即可访问类的成员 如果不进行封装&#xff0c;类中的实例变量可以直接查看和修改&#xff0c;可能给整个…

工具推荐:Wireshark网络协议分析工具(对比tcpdump)

文章首发地址 Wireshark是一款开源的网络协议分析工具&#xff0c;可以捕获网络数据包并对其进行详细的分析和解释。下面是Wireshark的详细介绍&#xff1a; Wireshark 工作原理 Wireshark通过捕获网络接口上的数据包&#xff0c;将其转换为可读的格式&#xff0c;并在界面…

vue3实现自定义select下拉框内容之城市区域篇

分享-2023年资深前端进阶&#xff1a;前端登顶之巅-最全面的前端知识点梳理总结 *分享一个使用比较久的&#x1fa9c; 需求分析&#xff1a; 1、实现一个区域下拉选项与现有ui组件库不同&#xff0c;支持多选、单选需求 2、支持选中区域后-全选中当前区域下的所有城市信息 3、…

安卓如何卸载应用

卸载系统应用 首先需要打开手机的开发者选项&#xff0c;启动usb调试。 第二步需要在电脑上安装adb命令&#xff0c;喜欢的话还可以将它加入系统path。如果不知道怎么安装&#xff0c;可以从这里下载免安装版本。 第三步将手机与电脑用数据线连接&#xff0c;注意是数据线&a…

贝叶斯深度学习的温和介绍

一、说明 欢迎来到令人兴奋的概率编程世界&#xff01;本文是对这个领域的温和介绍&#xff0c;你只需要对深度学习和贝叶斯统计有一个基本的了解。如果像我一样&#xff0c;你听说过贝叶斯深度学习&#xff0c;并且你猜它涉及贝叶斯统计&#xff0c;但你不知道它是如何使用的&…

iOS开发-处理UIControl触摸事件TrackingWithEvent

IOS BUG记录 之 处理UIControl的点击事件。 UIControl的触摸事件的方法是beginTrackingWithTouch:withEvent:&#xff0c;continueTrackingWithTouch:withEvent:&#xff0c;endTrackingWithTouch:withEvent:&#xff0c;cancelTrackingWithEvent: ##下面简单的介绍一下 beg…

【Express.js】集成Websocket

集成websocket 本节我们介绍在如何在 express 中集成 websocket。 WebSocket 服务器可以主动向客户端推送信息&#xff0c;客户端也可以主动向服务器发送信息&#xff0c;是真正的双向平等对话&#xff0c;属于服务器推送技术的一种。 准备工作 创建一个 express.js 项目&a…

LVS-DR模式集群配置

四台虚拟机 node1&#xff1a;128 node2&#xff1a;135 RS端&#xff1a; node3&#xff1a;130 node4&#xff1a;132 [rootnode2 ~]# yum install -y ipvsadm #配置LVS虚拟IP&#xff0c;没有ifconfig命令则先安装 [rootnode2 ~]# yum install net-tools -y #配置VIP [root…

GPT-4助力数据分析:提升效率与洞察力的未来关键技术 | 京东云技术团队

摘要 随着大数据时代的到来&#xff0c;数据分析已经成为企业和组织的核心竞争力。然而&#xff0c;传统的数据分析方法往往无法满足日益增长的数据分析需求的数量和复杂性。在这种背景下&#xff0c;ChatGPT-4作为一种先进的自然语言处理技术&#xff0c;为数据分析带来了革命…

Linux防火墙的配置

CentOS 要查看您的系统上的防火墙是否允许对PostgreSQL数据库的5432端口进行访问&#xff0c;可以按照以下步骤进行&#xff1a; 使用以下命令检查防火墙服务的状态&#xff1a; sudo systemctl status firewalld如果防火墙未运行&#xff0c;则说明您的系统上没有启用防火墙…

侯捷C++高级编程(下)

对于1个类要么像指针要么像函数 主题1:转换函数 转换函数 /** 1. 转换函数没有返回类型* 2. 转换函数一般需要加上const*/ class Fraction { public:Fraction(int num,int den1):m(num),n(den){cout<<"Fraction(int num,int den1): m/n "<< m/n<&…

A*算法的优化

改进OpenList开启列表 使用优先队列代替List 使用有限队列能够节约对OpenList的遍历 优先队列 using System.Collections; using System.Collections.Generic; using UnityEngine; using System;namespace YBZ.Algorithm {public class PriorityQueue<T> where T : ne…

50吨收费站生活一体化污水处理设备厂家价格低

50吨收费站生活一体化污水处理设备厂家价格低 设备工艺说明 污水处理设备主要用于生活污水和与之类似的工业有机废水的处理&#xff0c;其主要处理方法是采用目前较为成熟的生化处理技术—生物接触氧化&#xff0c;水质设计按一般生活污水水质设计计算&#xff0c;按BOD5平均20…

【图像分类】CNN + Transformer 结合系列.4

介绍两篇利用Transformer做图像分类的论文&#xff1a;CoAtNet&#xff08;NeurIPS2021&#xff09;&#xff0c;ConvMixer&#xff08;ICLR2022&#xff09;。CoAtNet结合CNN和Transformer的优点进行改进&#xff0c;ConvMixer则patch的角度来说明划分patch有助于分类。 CoAtN…

GitHub不能正常打开以及CSS样式加载不成功的解决方案

大家好&#xff0c;今天分享GitHub不能正常打开以及CSS样式加载不成功的解决方案。当GitHub在没有“科学上网”的情况下&#xff0c;不能正常打开时&#xff0c;最直接的检测方法就是 ping 掉包情况。&#xff08;当然还有其它抓包的方法&#xff09;。通过 ping github.com可见…

专业商城财务一体化-线上商城+进销存管理软件,批发零售全行业免费更新

订货流程繁琐&#xff1f;订单处理效率低&#xff1f;小程序商城与进销存系统不打通&#xff1f;数据需要手动输入同步&#xff1f;财务与的结算对账需要大量手工处理&#xff1f;零售批发从业者&#xff0c;如何你也有以上烦恼&#xff0c;可以看看进销存小程序订货商城&#…

python几岁可以学零基础,python多大的孩子可以学

大家好&#xff0c;小编为大家解答多大的孩子可以学python的问题。很多人还不知道学python多大年龄可以学&#xff0c;现在让我们一起来看看吧&#xff01; python编程是现在很多孩子接触编程的好选择&#xff0c;它能够给孩子带来容易入门的效果。那么&#xff0c;python编程少…