Spring理论知识(Ⅲ)——Spring面向切面编程

news2024/11/15 21:41:57

Spring的组成

Spring由20个核心依赖组成,这20个核心依赖可以分为6个核心模块
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
请添加图片描述

本文主要讲解spring的AOP模块,其中包括spring-aop,spring-aspects

Spring AOP模块概述

AOP思想

Spring AOP全面详解(超级详细)

AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。

面向切面编程,实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术。

AOP可以拦截指定的方法并且对方法增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离,比如Spring的事务,通过事务的注解配置,Spring会自动在业务方法中开启、提交业务,并且在业务处理失败时,执行相应的回滚策略。

在这里插入图片描述

在这里插入图片描述

主要作用是分离功能性需求和非功能性需求。使开发人员可以集中处理某一个关注点或者横切逻辑,减少对业务代码的侵入,增强代码的可读性和可维护性

简单的说,AOP 的作用就是保证开发者在不修改源代码的前提下,为系统中的业务组件添加某种通用功能。

AOP是在某个时期织入程序,实现程序功能的统一维护的一种技术

AOP织入时期

这里的某个时期,主要包括三种时期:

  1. 编译期:.java源代码文件预编译为.class字节码文件的过程。在编译时,由编译器把切面调用编译进字节码,这种方式需要定义新的关键字并扩展编译器,AspectJ就扩展了Java编译器,使用关键字aspect来实现织入;

  2. 类加载期:类加载器是JVM的一部分。类加载器将.class字节码文件转换为Java对象,实现class的加载和初始化,并实现Java对象和方法(除去构造方法,static方法以及final方法)的动态绑定 = C++的虚函数virtual = Java的多态

在这里插入图片描述

类加载器的分类,以及类加载器的双亲委派机制,读者可以自行学习

我们自定义的ClassLoader,可以自定义对类进行增强(在类加载时),也算是一种AOP思想的实现

  1. 运行期:
    这种方式的目标类对象和切面都是普通Java类,通过JDK的动态代理或者第三方库(CGLIB)实现运行期动态织入。
    这也是三种方式中最简单的方式,Spring AOP同时使用了JDK的动态代理和CGLIB的动态代理

在这里插入图片描述

在这里插入图片描述

AspectJ和Spring AOP的区别

事实上,AspectJ是Java AOP的完全解决方案,包含编译期织入,编译后织入,类加载期织入,不包含运行期织入(方法织入);而Spring AOP只包含了企业开发中使用最普遍的运行期织入(方法织入)

在这里插入图片描述

AspectJ

AspectJ 作为 AOP 编程的完全解决方案,提供了三种织入时机,分别为

  1. compile-time:编译期织入,在编译的时候一步到位,直接编译出包含织入代码的 .class 文件(需要指定aspectj-maven-plugin的maven插件以编译*.aj文件
  2. post-compile:编译后织入,增强已经编译出来的类,如我们要增强依赖的 jar 包中的某个类的某个方法(也需要指定aspectj-maven-plugin的maven插件)
  3. load-time:在 JVM 进行类加载的时候进行织入(需要在java启动时添加参数,例如:
    -javaagent:/Users/hongjie/.m2/repository/org/aspectj/aspectjweaver/1.8.13/aspectjweaver-1.8.13.jar;另外需要配置aop.xml配置文件配置需要织入的类)

AspectJ 使用介绍

AOP核心概念

JoinPoint:连接点

被AOP拦截到的点。在Spring AOP中指的是被拦截增强的目标类方法,因为Spring只支持方法类型的连接点(还有其他类型的连接点)

PointCut:切入点

要拦截的连接点的拦截规则(定义),比如拦截所有以ServiceImpl为结尾的类的findXXX()方法,这样的一条规则就叫切入点

Advice通知/增强

所谓通知是指拦截到Joinpoint之后所要做的事情,即对切入点的增强(功能增强/访问控制)
通知分为前置通知(如开启事务),后置通知(如提交事务),异常通知(如回滚事务),最终通知(如关闭JDBC资源),环绕通知(前置+后置+异常+最终,方法集合在一个方法内

Weaving(织入)

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

Proxy(代理)

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

Aspect(切面)

切入点通知的结合,切入点需要程序员手动定义和配置(配置文件),通知的方法需要程序员手动编写

spring-aop的pom依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aop</artifactId>
  <version>5.0.2.RELEASE</version>
  <name>Spring AOP</name>
  <description>Spring AOP</description>
  <url>https://github.com/spring-projects/spring-framework</url>
  <organization>
    <name>Spring IO</name>
    <url>http://projects.spring.io/spring-framework</url>
  </organization>
  <licenses>
    <license>
      <name>Apache License, Version 2.0</name>
      <url>http://www.apache.org/licenses/LICENSE-2.0</url>
      <distribution>repo</distribution>
    </license>
  </licenses>
  <developers>
    <developer>
      <id>jhoeller</id>
      <name>Juergen Hoeller</name>
      <email>jhoeller@pivotal.io</email>
    </developer>
  </developers>
  <scm>
    <connection>scm:git:git://github.com/spring-projects/spring-framework</connection>
    <developerConnection>scm:git:git://github.com/spring-projects/spring-framework</developerConnection>
    <url>https://github.com/spring-projects/spring-framework</url>
  </scm>
  <issueManagement>
    <system>Jira</system>
    <url>https://jira.springsource.org/browse/SPR</url>
  </issueManagement>
  <dependencies>
    <dependency>
      <groupId>com.jamonapi</groupId>
      <artifactId>jamon</artifactId>
      <version>2.81</version>
      <scope>compile</scope>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-pool2</artifactId>
      <version>2.4.3</version>
      <scope>compile</scope>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.8.13</version>
      <scope>compile</scope>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>5.0.2.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>5.0.2.RELEASE</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
</project>

aspectjweaver

AspectJWeaver作为AspectJ框架的核心组件,是一个用于实现AOP的Java库,是实现AOP的关键。

AspectJWeaver本身没有使用任何依赖,纯jdk代码(可能包含native的C代码,没看源码)编写

AspectJWeaver提供了切面(Aspect)、连接点(Join Point)、通知(Advice)等核心概念的实现。通过AspectJWeaver,开发者可以定义切面来横切多个类或方法,并在特定的连接点插入通知,从而在不修改原有代码的情况下增加新的功能或行为。

AspectJWeaver的工作原理:反射和代理模式

commons-pool2

开源对象池,决定哪些bean被spring aop代理增强

spring-beans

负责bean生命周期管理

spring-core

提供了Spring Ioc和DI的实现

spring-aspects的pom依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <!-- This module was also published with a richer model, Gradle metadata,  -->
  <!-- which should be used instead. Do not delete the following line which  -->
  <!-- is to indicate to Gradle or any Gradle module metadata file consumer  -->
  <!-- that they should prefer consuming it instead. -->
  <!-- do_not_remove: published-with-gradle-metadata -->
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aspects</artifactId>
  <version>6.1.5</version>
  <name>Spring Aspects</name>
  <description>Spring Aspects</description>
  <url>https://github.com/spring-projects/spring-framework</url>
  <organization>
    <name>Spring IO</name>
    <url>https://spring.io/projects/spring-framework</url>
  </organization>
  <licenses>
    <license>
      <name>Apache License, Version 2.0</name>
      <url>https://www.apache.org/licenses/LICENSE-2.0</url>
      <distribution>repo</distribution>
    </license>
  </licenses>
  <developers>
    <developer>
      <id>jhoeller</id>
      <name>Juergen Hoeller</name>
      <email>jhoeller@pivotal.io</email>
    </developer>
  </developers>
  <scm>
    <connection>scm:git:git://github.com/spring-projects/spring-framework</connection>
    <developerConnection>scm:git:git://github.com/spring-projects/spring-framework</developerConnection>
    <url>https://github.com/spring-projects/spring-framework</url>
  </scm>
  <issueManagement>
    <system>GitHub</system>
    <url>https://github.com/spring-projects/spring-framework/issues</url>
  </issueManagement>
  <dependencies>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.9.21.1</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
</project>

我们可以看到只有一个aspectjweaver

spring-aspectj是Spring对AspectJ的集成

spring-aop和spring-acpectj共同组成了spring的aop实现

Spring AOP的两种动态代理

基于JDK的动态代理和基于CGLIB的动态代理

JDK的动态代理适用于实现了接口的类,如果要代理的目标类没有实现任何一个接口,JDK的动态代理无法生效;此时我们可以用CGLIB实现动态代理(CGLIB是基于继承实现的代理)

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

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

相关文章

华为云低代码AstroZero技巧教学3:智能计算商品费用,轻松实现高效数据处理

公司经营过程中&#xff0c;多个场景会涉及到计算商品花费。以企业内部行政采购为例&#xff0c;在统计相关采购清单中&#xff0c;会涉及到诸多数据统计及计算。如采购商品种类、数量、单价以及其他附加成本&#xff08;运输费用&#xff0c;装卸费用&#xff0c;包装费用&…

网络安全ctf比赛/学习资源整理,解题工具、比赛时间、解题思路、实战靶场、学习路线,推荐收藏!

前言 对于想学习或者参加CTF比赛的朋友来说&#xff0c;CTF工具、练习靶场必不可少&#xff0c;今天给大家分享自己收藏的CTF资源&#xff0c;希望能对各位有所帮助。 CTF在线工具 首先给大家推荐我自己常用的3个CTF在线工具网站&#xff0c;内容齐全&#xff0c;收藏备用。…

第11章 第9节 基于软件质量特性的测试(软件评测师)

1.以下关于软件质量特性测试的叙述&#xff0c;正确的是&#xff08;&#xff09; 1.成熟性测试是检验软件系统故障&#xff0c;或违反指定接口的情况下维持规定的性能水平有关的测试工作 &#xff08;&#xff0c;成熟性测试是检验软件产品是否具备为避免由软件中错误而导致…

平价蓝牙耳机哪个音质好性价比高?四大超值平价机型推荐

在当今市场上&#xff0c;蓝牙耳机的选择众多&#xff0c;从高端品牌到平价型号&#xff0c;消费者面对的选择可谓是五花八门&#xff0c;并非每个人都愿意或能够负担得起昂贵的价格以获取顶级音质&#xff0c;所以平价蓝牙耳机哪个音质好性价比高&#xff1f;对于那些寻求性价…

springboot党员之家服务系统小程序论文源码调试讲解

第二章技术介绍 2.1B/S结构 随着软件系统的不断改进和升级&#xff0c;B/S结构产品更为方便的特征体现地十分明显。对于一个中等偏大的公司来说&#xff0c;如果系统管理员每天要在很多台电脑之间来回查看&#xff0c;不断奔走&#xff0c;那么效率和工作量就会变得很低&#…

服务器数据恢复—如何应对双循环RAID5阵列的数据丢失问题?

服务器存储数据恢复环境&#xff1a; 一台存储中有一组由7块硬盘组建的RAID5阵列&#xff0c;存储中还有另外3块盘是raid中掉线的硬盘&#xff08;硬盘掉线了&#xff0c;管理员只是添加一块的新的硬盘做rebuild&#xff0c;并没有将掉线的硬盘拔掉&#xff09;。整个RAID5阵列…

大模型全攻略:数据准备、模型微调到部署,一文全解析!

0. 引言 距离ChatGPT已经发布1年半了&#xff0c;距离我们训练出自己的大模型也已经1周年了。目前仍然有很多同学在咨询如何训练自己的大模型。这个东西和男/女朋友一样。当你不认识TA&#xff0c;距离TA很远&#xff0c;不敢接触TA的时候&#xff0c;TA就是很神秘&#xff0c…

基础闯关4

环境配置 我们来配置LlamaIndex实验环境&#xff0c;首先创建Python环境并安装必要的库&#xff1a; conda create -n llamaindex python3.10 conda activate llamaindex conda install pytorch2.0.1 torchvision0.15.2 torchaudio2.0.2 pytorch-cuda11.7 -c pytorch -c nvid…

通配符SSL证书自动续签自动部署方案

支持一对一答疑的购买网址 最开始接触 https 的时候一直是使用的 阿里云和腾讯云的免费 SSL证书&#xff0c;免费的SSL证书用了几年后&#xff0c;慢慢的部署https证书的项目越来越多&#xff0c;时间久了发现每个网站都需要一个 SSL证书&#xff0c;每个SSL证书都需要单独申请…

Unity 性能优化工具收集

本文地址&#xff1a;https://blog.csdn.net/t163361/article/details/141809415 Unity原始工具 UPR 官方 UPR UPR桌面端解决方案&#xff0c;减轻测试设备性能压力&#xff0c;使测试过程更加顺畅。提供CLI用于自动化测试系统对接。 PerformanceBenchmarkReporter Unity 性…

电动汽车行业智能充电桩语音提示IC方案

随着电动车市场的日益壮大&#xff0c;共享汽车也纷纷采用电动车这类新能源&#xff0c;预示着充电桩市场将迎来巨大的发展潜力。智能充电桩&#xff0c;其功能与加油站的加油机颇为相似&#xff0c;可灵活安装于公共建筑如商场、停车场以及居民小区内&#xff0c;为用户提供便…

IP SSL证书——为IP升级加密

在数字化浪潮中&#xff0c;每一份数据传输都承载着重要信息与价值。当您的业务跨越国界&#xff0c;触及全球用户时&#xff0c;确保通信安全、提升品牌信任度&#xff0c;成为了不可或缺的一环。IP SSL证书&#xff0c;作为网络安全的守护者&#xff0c;正以其独特的优势&…

前端怎么实现大模型对话

说一下前端怎么实现大模型&#xff0c;就是像什么通义千问文心一言GPT那样的&#xff0c;这个我之前做过啊就是这样的&#xff0c;这是我们以前在公司做的&#xff0c;对大家以后开发这种东西有一些参考&#xff0c;那我们当时做的时候是没有参考的&#xff0c;网上有这种相关的…

BITCN合集(BITCN 、BITCN-GRU、BITCN-BIGRU、BITCN-LSTM、BITCN-BILSTM、BITCN-SVM)

BITCN合集&#xff08;BITCN 、BITCN-GRU、BITCN-BIGRU、BITCN-LSTM、BITCN-BILSTM、BITCN-SVM&#xff09; BITCN合集&#xff08;BITCN 、BITCN-GRU、BITCN-BIGRU、BITCN-LSTM等&#xff09;代码获取戳此处代码获取戳此处代码获取戳此处 BITCN&#xff08;双向时间卷积神经网…

深入了解Pod(二)

一、StatefulSet 1、StatefulSet介绍 StatefulSet是用于在Kubernetes集群中管理有状态应用的一种资源对象&#xff0c;比如Mysql、MongoDB等。有状态应用是指依赖持久性存储并且在集群重启后仍然保持状态的应用。StatefulSet可以确保有状态应用在集群中的唯一性和稳定性。 Sta…

英特尔或将计划剥离资产削减成本

KlipC报道&#xff1a;有消息称&#xff0c;英特尔正在计划剥离不必要的的业务和调整资本支出以重振公司&#xff0c;其中包括出售可编程芯片部门Altera在内的业务来削减总体成本。其现在正在与投资银行高盛集团和摩根士丹利合作&#xff0c;讨论各种方案。 据KlipC了解&#…

LabVIEW水泵机组监控系统

介绍了一种基于LabVIEW的水泵机组智能监控系统。该系统结合先进的传感器和数据采集技术&#xff0c;实时监控水泵机组的运行状态&#xff0c;有效预防故障&#xff0c;提高运行效率。通过LabVIEW平台的集成开发环境&#xff0c;系统实现了高效的数据处理和友好的用户界面。 项…

线上报名链接怎么做_零基础小白也能做

在这个日新月异的数字时代&#xff0c;每一次点击都可能是通往新世界的钥匙。今天&#xff0c;我们诚挚地向您发出邀请&#xff0c;通过这独一无二的线上报名链接&#xff0c;不仅简化繁琐的报名流程&#xff0c;更让您轻松跨越现实的界限&#xff0c;踏入一场精心策划的盛宴或…

氢气传感器的工作寿命一般是多久?

​ ​氢气传感器的工作寿命因多种因素而存在较大差异&#xff0c;这些因素包括传感器的类型、品牌、使用环境以及日常维护情况等。 ​ ​催化燃烧式氢气传感器通常具有相对较长的工作寿命&#xff0c;大约在 2 至 5 年。在其工作过程中&#xff0c;催化剂会随着时间的推移…

数量比例问题

水果店运来西瓜和白兰瓜的个数比是7&#xff1a;5。如果每天卖出白兰瓜40个&#xff0c;西瓜50个&#xff0c;若干天后卖完白兰瓜时&#xff0c;西瓜还剩36个。那么&#xff0c;水果店运来的西瓜有&#xff08;&#xff09;个。 A 240 B 360 C 476 D 336【正确答案】 方法1&…