003 AOP介绍

文章目录

    • 什么是AOP
    • 为什么用AOP
    • AOP相关术语介绍
    • AOP实现之AspectJ(了解)
    • AOP实现之Spring AOP(了解)
      • JDK动态代理
      • Cglib动态代理

什么是AOP

  • 在软件业中,AOP为Aspect Oriented Programming的缩写,意为面向切面编程
  • 作用:在不修改目标类代码的前提下,可以通过AOP技术去增强目标类的功能。通过[预编译方式]和[运行期动态代理]实现程序功能的统一维护的一种技术
  • AOP是一种编程范式,隶属于软工范畴,指导开发者如何组织程序结构
  • AOP最早由AOP联盟的组织提出的,制定了一套规范 Spring将AOP思想引入到框架中,必须遵守AOP联盟的规范
  • AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型
  • 利用AOP可以对业务代码中[业务逻辑]和[系统逻辑]进行隔离,从而使得[业务逻辑]和[系统逻辑]之间的耦合度降低,提高程序的可重用性,同时提高了开发效率

为什么用AOP

作用:
AOP采取横向抽取机制,补充了传统纵向继承体系(OOP)无法解决的重复性代码优化(性能监视、事务管理、安全检查、缓存),将业务逻辑和系统处理的代码(关闭连接、事务管理、操作日志记录)解耦
优势:
重复性代码被抽取出来之后,维护更加方便

  • 纵向继承体系:
    纵向继承体系

  • 横向抽取机制
    横向抽取机制

AOP相关术语介绍

  • Joinpoint(连接点)

所谓连接点指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点

  • Pointcut(切入点)

所谓切入点是指我们要对哪些Joinpoint进行拦截的定义

  • Advice(通知/增强)

所谓通知是指拦截到Joinpoint之后所要做的事情就是通知。通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)

  • Introduction(引介)

引介是一种特殊的通知在不修改类代码的前提下,Introduction可以在运行期为类动态地添加一些方法或Field

  • Target(目标对象)

代理的目标对象

  • Weaving(织入)

是指把增强应用到目标对象来创建新的代理对象的过程

  • Proxy(代理)

一个类被AOP织入增强后,就产生一个结果代理类

  • Aspect(切面)

是切入点和通知的结合,以后自己编写和配置的

  • Advisor(通知器、顾问)

和Aspect相似

AOP实现之AspectJ(了解)

  • AspectJ是一个Java实现的AOP框架,它能够对java代码进行AOP编译(一般在编译期进行),让java代码具有AspectJ的AOP功能(当然需要特殊的编译器)
  • 可以这样说AspectJ是目前实现AOP框架中最成熟,功能最丰富的语言。更幸运的是,AspectJ与java程序完全兼容,几乎是无缝关联,因此对于有java编程基础的工程师,上手和使用都非常容易
  • 了解AspectJ应用到java代码的过程(这个过程称为织入),对于织入这个概念,可以简单理解为aspect(切面)应用到目标函数(类)的过程
  • 对于织入这个过程,一般分为动态织入和静态织入,动态织入的方式是在运行时动态将要增强的代码织入到目标类中,这样往往是通过动态代理技术完成的,如Java JDK的动态代理(Proxy,底层通过反射实现)或者CGLIB的动态代理(底层通过继承实现),Spring AOP采用的就是基于运行时增强的代理技术
  • AspectJ采用的就是静态织入的方式。AspectJ主要采用的是编译期织入,在这个期间使用AspectJ的acj编译器(类似javac)把aspect类编译成class字节码后,在java目标类编译时织入,即先编译aspect类再编译目标类
    在这里插入图片描述

AOP实现之Spring AOP(了解)

实现原理分析

  • Spring AOP是通过动态代理技术实现的
  • 而动态代理是基于反射设计的
  • 动态代理技术的实现方式有两种:基于接口的JDK动态代理和基于继承的CGLib动态代理
    实现原理

JDK动态代理

目标对象必须实现接口

//1.使用Proxy类来生成代理对象的一些代码如下:
/**
*	使用JDK的方式生成代理对象
*/
public class MyProxyUtils {public static UserService getProxy(final UserService service) {//使用Proxy类生成代理对象UserService proxy = (UserService) Proxy.newProxyInstance(service.getClass().getClassLoader(),service.getClass().getInterfaces(),new InvocationHandler(){//代理对象方法一执行,invoke方法就会执行一次public Object invoke(Object proxy,Method method,Object[] args) throws Throwable {if("save".equals(method.getName())){System.out.println("记录日志....");//开启事务}//提交事务//让service类的save或update方法正常的执行下去return method.invoke(service,args);}});//返回代理对象return proxy;}
}

Cglib动态代理

  • 目标对象不需要实现接口
  • 底层是通过继承目标对象产生代理子对象(代理子对象中继承了目标对象的方法,并可以对该方法进行增强)
public static UserService getProxy(){//创建CGLIB核心的类Enhancer enhancer = new Enhancer();//设置父类enhancer.setSuperclass(UserServiceImpl.class);//设置回调函数enhancer.setCallback(new MethodInterceptor() {@Overridepublic Object intercept(Object obj,Method method,Object[] args,MethodProxy methodProxy) throws Throwable {if("save".equals(method.getName())){//记录日志System.out.println("记录日志了...");}return methodProxy.invokeSuper(obj,args);}});//生成代理对象UserService proxy = (UserService) enhancer.create();return proxy;
}

使用

  • 其使用ProxyFactoryBean创建
  • 使用<aop:advisor>定义通知器的方式实现AOP则需要通知类实现Advice接口
  • 增强(通知)的类型有:

前置通知:org.springframework.aop.MethodBeforeAdvice
后置通知:org.springframework.aop.AfterReturningAdvice
环绕通知:org.aopalliance.intercept.MethodInterceptor
异常通知:org.springframework.aop.ThrowsAdvice

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

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

相关文章

数仓开发那些事_番外

一位神州的正式员工&#xff08;没错&#xff0c;就是之前文章中出现的实习生&#xff09;&#xff1a;一闪&#xff0c;你今年涨工资了吗&#xff1f; 一闪&#xff1a;mad&#xff0c;一年辛苦到头只涨了500米 神州员工&#xff1a;你去年绩效不是优秀吗&#xff0c;怎么就涨…

【单调栈算法题记录】739. 每日温度

题目描述 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 初始答案 我先…

微信小程序录音机源代码

<!-- <button bind:tap"startTab">开始录音</button> <button bind:tap"stopTab">结束录音</button> <button bind:tap"playTab">播放录音</button> <view style"margin: 0 auto;">{{ti…

【机器学习】第10章 聚类算法

一、概念 1.聚类 &#xff08;1&#xff09;是无监督学习&#xff0c;其实无监督学习就是无中生有&#xff0c;不给你标准答案&#xff08;标签啊啥的&#xff09;&#xff0c;然后让你自己来。 &#xff08;2&#xff09;聚类就是这样&#xff0c;让机器自己根据相似特征把相…

ThreadLocal内存泄漏

什么是内存泄漏&#xff1f; 内存泄漏发生在程序中已动态分配的堆内存由于某种原因未被释放或无法释放&#xff0c;导致系统内存浪费。 这种情况会让程序运行速度变慢&#xff0c;甚至可能导致系统崩溃。 ThreadLocal是Java提供的一个本地线程副本变量工具类&#xff0c;它允…

AOSP刷Fart8脱壳机安装及使用

我的电脑硬件不支持对AOSP源码进行编译&#xff0c;所以只能用别人编译好的刷机包进行刷机。使用的刷机包是luffy 8期 day37 下的v5目录下的taimen包&#xff0c;这个刷机包里面 的AOSP是 UserDebug 版本&#xff0c;已经实现的功能有&#xff1a; - root特征隐藏 - Fart特征隐…

架构模式——分层架构

分层架构&#xff1a;软件设计的经典之选 分层架构是软件开发中一种常见且广泛应用的架构模式。它通过将应用程序划分为不同的层次&#xff0c;每一层都承担特定的职责&#xff0c;从而帮助开发者组织代码、简化复杂性&#xff0c;并增强系统的可维护性和可扩展性。本文将详细…

asio之select_interrupter

简介 select_interrupter用于唤醒reactor的事件循环&#xff0c;其是对不同唤醒机制的别名 定义 在有eventfd时&#xff0c;表示的是eventfd_select_interrupter&#xff0c;在window平台下使用的是socket_select_interrupter &#xff0c;否则表示的是pipe_select_interrup…

如何去掉el-input-number两侧的上下按键

期初做法 输入的数据都是数字&#xff0c;就想着使用number类型的输入框但是输入框很小的情况下&#xff0c;就会导致上下按键特别占地方&#xff0c;所以想去掉使用deep 语法进行样式覆盖 <style scoped> /deep/ input::-webkit-outer-spin-button, /deep/ input::-webk…

适合度与挑战并存的计算机相关专业!计算机行业前景看好!

作为即将踏入大学校门的高考生&#xff0c;我在选择专业时&#xff0c;计算机相关专业无疑是一个热门选项。然而&#xff0c;随着市场竞争的加剧和行业饱和度的提高&#xff0c;我对此类专业的未来发展产生了些许疑虑。  首先&#xff0c;计算机科学与技术、人工智能、网络安…

char 型变量中能不能存贮一个中文汉字?为什么?

在 Java 中&#xff0c;char 类型变量可以存储一个中文汉字&#xff0c;这是因为 char 类型使用 Unicode 编码&#xff0c;而 Unicode 编码字符集包括了大量的汉字。详细解释如下&#xff1a; Unicode 和 Java 中的 char 类型 Unicode 编码&#xff1a; Unicode 是一种字符编码…

数据仓库之Kappa架构

Kappa架构是一种简化的数据处理架构&#xff0c;旨在处理实时数据流&#xff0c;解决传统Lambda架构中批处理和实时处理的复杂性。Kappa架构完全基于流处理&#xff0c;不区分批处理和实时处理&#xff0c;所有数据都是通过流处理系统进行处理。以下是对Kappa架构的详细介绍&am…

【ArcGIS微课1000例】0120:ArcGIS批量修改符号的样式(轮廓)

ArcGIS可以批量修改符号的样式,如样式、填充颜色、轮廓等等。 文章目录 一、加载实验数据二、土地利用符号化三、批量修改符号样式四、注意事项一、加载实验数据 订阅专栏后,从私信查收专栏配套的完整实验数据包,打开0120.rar中的土地利用数据,如下图所示: 查看属性表: …

事务所管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;客户管理&#xff0c;评论管理&#xff0c;基础数据管理&#xff0c;公告信息管理 客户账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;律师管理&#xff0…

如果搜索一定超时,如何用dp来以空间换时间

E - Alphabet Tiles (atcoder.jp) 题目大意&#xff1a;1到k长度的字符串时&#xff0c;在A-Z给定数量下&#xff0c;搭配出多少种不同的字符串 思路 排列组合&#xff0c;会死人的 暴搜&#xff1a;可以解决&#xff0c;但是时间太长 dp&#xff1a;考虑前 i 个字母&…

下载lombok.jar包,简化类的代码

Download (projectlombok.org) 去这个网站下载lombok.jar包 打开这个包文件的位置,拖到项目lib文件夹: 在这里右键添加为库(Add as library)。 添加这三个注解即可&#xff0c;类里面不需要其他东西了

浏览器 插件 Lighthouse

Lighthouse是一款开源的自动化工具&#xff0c;它能够帮助改善你的web应用程序的性能、质量和正确性。你可以在任何网页上运行它&#xff0c;无论是公开的还是需要认证的。 Lighthouse有一款Chrome扩展插件&#xff0c;也可以在Chrome DevTools中使用&#xff0c;或者作为Node…

【代码随想录】【算法训练营】【第41天】 [416]分割等和子集

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 40&#xff0c;休息&#xff0c;休息一下~ day 41&#xff0c;艰难的周一~ 题目详情 [416] 分割等和子集 题目描述 416 分割等和子集 解题思路 前提&#xff1a;是否可以将数组分为和相等的…

css中content属性你了解多少?

在CSS中&#xff0c;content属性通常与伪元素&#xff08;如 ::before 和 ::after&#xff09;一起使用&#xff0c;用于在元素的内容之前或之后插入生成的内容。这个属性不接受常规的HTML内容&#xff0c;而是接受一些特定的值&#xff0c;如字符串、属性值、计数器值等。 以…

计算机组成原理-期末考前常见简答题总结

1、简述冯-诺伊曼计算机的主要设计思想&#xff0c;它有哪些部件构成&#xff1f; 主要思想&#xff1a;存储程序和程序控制。将解题程序防止存储器中&#xff0c;程序控制&#xff1a;控制器顺序执行程序&#xff0c;按指令功能控制全机协调地完成运算任务。主要部件有控制器…