003 AOP介绍

news2024/10/7 12:17:09

文章目录

    • 什么是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() {
			@Override
			public 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.coloradmin.cn/o/1834104.html

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

相关文章

Ubuntu乌班图安装VIM文本编辑器工具

系列文章目录 Ubuntu-24.04-live-server-amd64安装界面中文版 Ubuntu-24.04-live-server-amd64启用ssh Ubuntu安装qemu-guest-agent 文章目录 系列文章目录前言一、安装VIM&#xff1f;二、VIM基本设置总结 前言 从centos转到Ubuntu发现默认安装没有vi 一、安装VIM&#xff1…

服务器部署开源大模型完整教程 Ollama+Gemma+open-webui

现在开源的大模型其实挺多的&#xff0c;今天搭建Gemma这个谷歌开源的大模型&#xff0c;但是你想搭建别的只要你看完你都会了。 介绍 Ollama&#xff1a;一款可以让你在本地快速搭建大模型的工具 官网&#xff1a;https://ollama.com/ github&#xff1a;https://github.c…

【机器学习】智能创意工厂:机器学习驱动的AIGC,打造未来内容新生态

&#x1f680;时空传送门 &#x1f50d;机器学习在AIGC中的核心技术&#x1f4d5;深度学习&#x1f388;生成对抗网络&#xff08;GANs&#xff09; &#x1f680;机器学习在AIGC中的具体应用&#x1f340;图像生成与编辑⭐文本生成与对话系统&#x1f320;音频生成与语音合成 …

关于阿里云效流水线自动部署项目教程

1、登录阿里云效:阿里云登录 - 欢迎登录阿里云&#xff0c;安全稳定的云计算服务平台 2、点击左侧流水线&#xff1a; 3、在流水线界面&#xff0c;新建流水线 4、我的是php代码&#xff0c;因此选择php模版 5、创建之后添加流程线源&#xff0c;如下图 6、选择相应的源头。比…

【市场分析】TEMU平台美国区品牌产品市场分析Python采集爬虫数据

文章目录 一、引言二、数据概述1. 数据字段展示2. 数据统计信息展示 三、数据分析3.1 店铺托管模式3.1.1 半托管与全托管占比 3.2 品牌化最多的类目3.2.1 数据可视化展示3.2.2 各类目品牌商品占比分布 3.3 商品占比最多的Top品牌3.2.1 数据可视化展示3.2.2 品牌商品数量占比Top…

物联网技术-第6章-物联网应用案例

目录 1.共享单车 2.自动驾驶汽车 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;关键技术 &#xff08;3&#xff09;典型代表 3.智能电网 4.智能交通 &#xff08;1&#xff09;车联网 &#xff08;2&#xff09;无人驾驶 5.智能物流 6.致谢 1.共享单车…

【语义分割系列】基于camvid数据集的Deeplabv3+分割算法(二)

基于camvid数据集的Deeplabv3+分割算法 前言 在前面的内容中,对比了Camvid数据集在基于不同backbone的Deeplabv3+算法上的效果。在这节内容中,本文将介绍在ghostnet的基础上,进一步优化效果,使得Miou提升。通过引入CFAC和CARAFE结构,有效地提升了模型的miou。 1.代码部…

JeecgFlow排他网关演示

排他网关概念理解 排他网关&#xff0c;也称为异或(XOR)网关&#xff0c;用于流程中实现分支决策建模。排他网关需要搭配条件顺序流使用。 当流程流转到排他网关时&#xff0c;所有流程顺序流都是会顺序求解&#xff0c; 其中第一条条件为true的顺序流会被选中(当有多条顺序流都…

每日一题——8行Python代码实现PAT乙级1029 旧键盘(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码评析 时间复杂度 空间复杂度 我要更强 方法一&#xff1a;使用集合…

OpenGL Super Bible 7th - Drawing Our First Triangle(绘制第一个三角形)

简介 本文的原版为《OpenGL Super Bible 7th》,是同事给我的,翻译是原文+译文的形势。文章不属于机器直译,原因在于语言不存在一一对应的关系,我将尽可能的按照中国人看起来舒服的方式来翻译这些段子,如果段子让你感到身心愉悦,那还劳烦点个关注,追个更。如果我没有及时…

IT入门知识第四部分《数据库》(4/10)

目录 1. 数据库基础 1.1 数据库的定义 1.2 数据库的关键概念 数据模型 数据库架构 数据库操作语言&#xff08;DML 和 DDL&#xff09; 总结 2. 关系型数据库 2.1 MySQL MySQL 的历史和特点 MySQL 的安装和配置 MySQL 的基本操作 2.2 PostgreSQL PostgreSQL 的特…

软件测试期末复习

软件测试期末复习 Author 雨 2024年6月18日 1. 什么是软件测试 从一个通常为无限的执行域中选取合适的有限的测试用例&#xff0c;对程序所期望的行为进行动态验证的活动过程。 2. 软件测试的目的 尽早地发现软件的缺陷 3.什么是测试什么是缺陷 从软件内部看&#xff1a;软件开…

在 Stable Diffusion 中控制光线的三种方式

光线在摄影中扮演着至关重要的角色&#xff0c;并对图像的整体质量和意境产生重要影响。你可以利用光线来增强主题&#xff0c;创造深度和立体感&#xff0c;传达情感&#xff0c;并突出重要细节。 在本文中&#xff0c;你将了解通过以下方法来控制光线&#xff1a; 光线提示…

【推荐100个unity插件之21】unity实现多语言切换功能——Localization插件的使用

文章目录 前言优缺点优点缺点 安装创建配置选择语言选择默认语言创建多语言表数据创建key配置不同语言文本预加载绑定不同多语言文本数据&#xff0c;并显示语言切换自己编写按钮控制语言切换多语言图片切换在构建中使用Localization分析错误修复动态修改多语言文本内容参考推荐…

高考后的抉择:如何在心仪专业与知名学校之间做出选择?

目录 前言1. 专业选择的深度探讨1.1 专业的优势与挑战1.1.1 课程学习1.1.2 就业前景 1.2 专业选择的个人经验与思考 2. 名校对个人发展的长短期影响2.1 名校声誉的品牌效应2.1.1 职业发展2.1.2 社会认可度 2.2 教育资源与学术氛围2.2.1 教育资源2.2.2 学术氛围 2.3 就业优势 3.…

【2024最新精简版】RabbitMQ面试篇

文章目录 Kafka和RabbitMQ什么区别惰性队列&#xff08;Lazy Queues&#xff09;是怎么实现的&#xff1f;RabbitMQ工作模式有哪些 ?你们项目中哪里用到了RabbitMQ ?为什么会选择使用RabbitMQ ? 有什么好处 ?使用RabbitMQ如何保证消息不丢失 ?消息的重复消费问题如何解决的…

3.1、前端异步编程(超详细手写实现Promise;实现all、race、allSettled、any;async/await的使用)

前端异步编程规范 Promise介绍手写Promise&#xff08;resolve&#xff0c;reject&#xff09;手写Promise&#xff08;then&#xff09;Promise相关 API实现allraceallSettledany async/await和Promise的关系async/await的使用 Promise介绍 Promise是一个类&#xff0c;可以翻…

Spring技术——介绍、初识

从这篇博客正式开始学习 Spring 。 一、整个Spring技术学习的介绍 首先先对 Spring 做一个简单的认识&#xff0c;并从以下3个方面了解学习Spring 技术的意义&#xff1a; &#xff08;1&#xff09;为什么要学习 Spring 技术&#xff1f; 1、它的市场的占有率很高&#xff…

webpack 压缩图片

压缩前&#xff1a; 压缩后&#xff1a; 压缩后基本上是压缩了70-80%左右 1.依赖版本及配置 "imagemin-webpack-plugin": "^2.4.2", "imagemin-mozjpeg": "^7.0.0", "imagemin-pngquant": "^5.0.1", "webpa…

ClickHouse安装与下载22.3.2.2

ClickHouse安装与下载 目录 1. ClickHouse简介 1.1 ClickHouse优点&#xff1a; 1.2 ClickHouse缺点&#xff1a; 1.3 ClickHouse引擎&#xff1a; 1.3.1 数据库引擎 1.3.2 表引擎 2. ClickHouse下载安装 2.1 ClickHouse下载安装 2.2 ClickHouse使用 1. ClickHouse简…