当前位置: 首页 > news >正文

【spring】springAOP

1.基本概念

AOP即面向切面编程,它利用的是一种横切技术,解剖开封装的对象内部,并将那些影响多个类的公共行为封装到一个可重 用模块,这就是所谓的Aspect方面/切面。所谓的切面,简单点所说,就是将哪些与业务无关,却为业务 模块所共同调用的行为(方法)提取封装,减少系统的重复代码,以达到逻辑处理过程中各部分之间低 耦合的隔离效果。

Spring AOP 的实现基于动态代理技术(JDK 或 CGLIB),但为了简化开发,它引入了 AspectJ 的注解模型(如@Aspect@Pointcut等),从而支持更简洁的切面定义。

    2.AOP相关术语

    切面:切面就是对横切关注点进行模块化封装的一种方式,在SpringAop中就是一个类。例如要实现一个登录页面的功能,但是我想要在登录前进行权限的验证,判断你是管理员还是用户,此时不可能直接把这个功能直接写在登录页面的功能里,会提高耦合性,所以就可以另写一个类将权限验证的功能封装。

    在SpringAop中用@Aspect对相关类标记为切面。

    连接点:连接点指的是程序执行过程中可以插入切面的特定位置。在 Spring AOP 中,连接点仅支持方法执行这一种情况,也就是在某个方法调用或者方法执行前后这些时间点。

    还是上面的例子,当你准备执行登录的方法时,该方法就是一个连接点,切面中实现的登录验证就可以在该方法前执行。

    切点:切点是用于匹配连接点的表达式,它定义了哪些连接点会被应用通知。通过切点表达式,可以精确地筛选出需要增强的方法。它就是用来定位那些被增强的方法,使得通知能够准确的应用到目标方法(也就是这些被增强的方法)

    这里的被增强的方法就是那些被切面分装了相关方法准备在该方法前后执行,就比如登录方法多了个权限验证功能,那么这个登录方法就是被增强的方法。

    spring中用@Pointcut来指定相应的包进行扫描,来定位包中的方法是否为被增强的方法,它有一个切点表达式,来负责筛选被增强的方法。

    切点表达式的定义如下

    @Pointcut(“execution([修饰符] 返回类型 [包名..][类名.]方法名([参数]))”)

    修饰符:可选(如publicprivate),可省略。

    返回类型:必须,用*表示任意返回类型。

    包名com.example.service表示特定包;com.example..表示递归匹配子包。

    类名UserService表示特定类;*Service表示类名以Service结尾。

    方法名saveUser表示特定方法;*表示所有方法。

    参数(User)表示参数为User类型;(..)表示任意数量参数。

    通知:通知就是规定在切点即被增强的方法执行方法的逻辑,就比如前面说到的又在登录功能前加上一个权限验证的方法,通知就是用来规定权限验证功能必须在登录前执行,而不是登录后执行,也就是规定了执行的逻辑。

    下面列举几种通知的类型(结合spring的注解)

    @Before:前置通知,就是在切点执行前执行

    @AfterReturning:返回后通知,就是在切点正常执行后执行

    @AfterThrowing:异常后通知,就是在切点执行时出现异常时执行

    @After:后置通知(最终通知),无论切点是正常执行还时执行时出现异常,它都会在他后执行,相当于是个收尾的执行。

    @Around:环绕通知,它会完全包裹切点的执行,可以在它执行前后进行执行,甚至可以控制切点执行与否以及如何执行,也就是说它对切点执行前后都有控制权。

    目标对象:目标对象指的是包含核心业务逻辑的原始对象,也就是被一个或多个切面所增强的对象。简单来说,就是我们希望对其方法进行额外功能增强(如添加日志记录、事务管理等)的那个对象。

    代理:代理是指 Spring AOP 为目标对象生成的一个包装对象,该对象与目标对象具有相同的接口(对于 JDK 动态代理)或者继承自目标对象(对于 CGLIB 代理)。代理对象会拦截对目标对象方法的调用,并在调用前后插入切面中定义的通知逻辑,从而实现对目标对象方法的增强。

    在 Spring AOP 中,通过@EnableAspectJAutoProxy注解启用自动代理功能,Spring 会根据目标对象是否实现接口来选择使用 JDK 动态代理还是 CGLIB 代理。也可以通过proxyTargetClass属性强制使用 CGLIB 代理:

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.EnableAspectJAutoProxy;@SpringBootApplication
    @EnableAspectJAutoProxy(proxyTargetClass = true) // 强制使用CGLIB代理
    public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
    }

    织入:

    织入是 AOP 的核心步骤,它将切面中定义的切点(Pointcut)和通知(Advice)与目标对象的方法进行关联,使得在目标方法执行时,通知逻辑能够被触发。

    织入的时机
    AOP 框架的织入可以发生在以下阶段:

    编译时(Compile-time Weaving):在目标类编译时进行织入(如 AspectJ)。
    类加载时(Load-time Weaving):在目标类被加载到 JVM 时进行织入(如 AspectJ 的 LTW)。
    运行时(Runtime Weaving):在程序运行时通过动态代理动态织入(如 Spring AOP)。

    引入:

    引入本质上是一种类型级别的增强,它打破了传统面向对象编程中类的功能固定性,通过 AOP 的方式,在运行时为类添加额外的接口实现,从而让类拥有新的行为和状态。

    在 Spring AOP 中,引入主要通过 @DeclareParents 注解来实现。该注解可以指定一个接口,让目标类实现这个接口,并提供一个默认的实现类,从而为目标类添加新的方法。

    使用上面那些注解时需要现在xml文件中开启spring对aop的注解支持

    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

    要把它定义再bean标签中 

    3.SpringAOP实现事务管理

    当我们要对数据库进行CRUD操作时,如果不对其进行事务管理,那么数据库无疑就是在“裸奔”,会出现各种各样的问题,如事务一致性,原子性等遭到破坏,在spring中也是同样的,只要涉及到对数据库的操作时,事务管理是必要的的。

    在具体讲之前,先回忆一下数据库的基础事务操作

    START:开启事务,显示启动事务,后续的sql操作会被视为事务的一部分

    COMMIT:提交事务,将所有的操作保存到数据库中,提交后,数据不可变更,不允许滚回。

    ROLLBACK:回滚事务,撤销事务中所有未提交的操作,回滚到事务开启前的状态。

    SAVEPOINT:保存点,在事务中设置中间保存点,允许部分回滚到该点。

    下面详细讲解具体的操作

    3.1maven相关依赖配置

    具体依赖如下

    <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>spring-transaction-aop-example</artifactId><version>1.0-SNAPSHOT</version><properties><!-- Spring 版本 --><spring.version>6.1.4</spring.version><!-- AspectJ 版本 --><aspectj.version>1.9.20</aspectj.version><!-- MySQL 驱动版本 --><mysql.version>8.2.0</mysql.version></properties><dependencies><!-- Spring Context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><!-- Spring AOP --><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${spring.version}</version></dependency><!-- Spring Transaction --><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${spring.version}</version></dependency><!-- AspectJ Weaver --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>${aspectj.version}</version></dependency><!-- Spring JDBC --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><!-- MySQL 数据库驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.11.0</version><configuration><source>17</source><target>17</target></configuration></plugin></plugins></build>
    </project>

    3.2配置数据源

    在spring相关的xml文件中的bean标签内配置相关数据库的具体信息,以便能够连上数据库。

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test"/><property name="username" value="root"/><property name="password" value="password"/>
    </bean>

    写在这里比直接写在具体的代码中更加方便后期的修改与维护,而不用直接在代码中去修改。

    3.3配置事务资源管理器

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/>
    </bean>

    它这里将数据源注入了事务资源管理器,这样事务资源管理器就知道从哪个数据源获取数据库连接来进行事务管理。

    3.4配置事务管理

    <!-- 启用声明式事务 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

    在需要管理的业务方法上添加@Transactional,基础使用如下

    @Transactional
    public void saveOrder() {// 数据库操作(增删改)orderDao.insert(order);userDao.updateBalance(userId, amount);
    }

    他会在方法正常执行后自动提交,出现异常时自动回滚。

    扩展配置如下:通过相关参数来定制事务

    propagation事务传播行为(默认REQUIRED
    isolation事务隔离级别(默认DEFAULT
    rollbackFor指定需要回滚的异常类型(如SQLException.class
    timeout事务超时时间(秒)
    readOnly是否为只读事务(默认false
    @Transactional(propagation = Propagation.REQUIRES_NEW, // 强制新建事务isolation = Isolation.SERIALIZABLE,    // 最高隔离级别rollbackFor = Exception.class,         // 回滚所有异常timeout = 30                           // 超时时间30秒
    )
    public void criticalOperation() { ... }

    3.5注意事项

    1. 注解作用域@Transactional仅对public方法有效。
    2. 内部调用问题:类内部方法调用被注解的方法时,事务不会生效(需通过代理对象调用)。

    3.6底层原理

    Spring 通过AOP 动态代理实现事务织入:

    1. 代理创建:Spring 为目标类生成代理对象(JDK 或 CGLIB 代理)。
    2. 方法拦截:代理对象拦截被@Transactional标记的方法调用。
    3. 事务逻辑
      • 调用方法前:开启事务(beginTransaction)。
      • 方法正常执行后:提交事务(commit)。
      • 方法抛出异常时:回滚事务(rollback)。

     

    相关文章:

    【spring】springAOP

    1.基本概念 AOP即面向切面编程&#xff0c;它利用的是一种横切技术&#xff0c;解剖开封装的对象内部&#xff0c;并将那些影响多个类的公共行为封装到一个可重 用模块&#xff0c;这就是所谓的Aspect方面/切面。所谓的切面&#xff0c;简单点所说&#xff0c;就是将哪些与业务…...

    解决VMware虚拟机CentOS 7 忘记登陆密码问题

    1. 重启虚拟机&#xff0c;在重启时不停按E键进入初始化脚本编辑界面 2.在初始化脚本编辑界面&#xff0c;按↓键向下拉到最后&#xff0c;找到LANG/zh_CN.UTF-8那里&#xff0c;输入空格&#xff0c;接着添加 "init/bin/sh" 。然后按ctrlX键进入下一步。 3. 在界面中…...

    如何在 Windows 10 启用卓越性能模式及不同电源计划对比

    在使用 powercfg -duplicatescheme 命令启用 “卓越性能模式”&#xff08;即 Ultimate Performance 模式&#xff09;之前&#xff0c;有几个前提条件需要注意&#xff1a; 前提条件&#xff1a; 系统版本要求&#xff1a;卓越性能模式 仅在 Windows 10 专业版 或更高版本&a…...

    基于 GEE 利用 Sentinel-2 数据反演叶绿素与冠层水分含量

    目录 1 数据加载与预处理 2 叶绿素含量反演 3 冠层水分反演 4 数据可视化与导出 5 完整代码 6 运行结果 在生态学和环境科学领域&#xff0c;植被的健康状况是评估生态系统稳定性和功能的关键指标之一。而叶绿素含量和冠层水分含量作为反映植被生理状态的重要参数&#x…...

    《鸿蒙系统下AI模型训练加速:时间成本的深度剖析与优化策略》

    在当今数字化浪潮中&#xff0c;鸿蒙系统凭借其独特的分布式架构与强大的生态潜力&#xff0c;为人工智能的发展注入了新的活力。随着AI应用在鸿蒙系统上的日益普及&#xff0c;如何有效降低模型训练的时间成本&#xff0c;成为了开发者与研究者们亟待攻克的关键课题。这不仅关…...

    PyTorch分布式训练

    本文结构&#xff1a; 分布式训练概述环境设置数据并行&#xff08;DDP&#xff09;模型并行启动训练性能优化建议示例代码参考资料和相关问题 以下是为您整理的PyTorch分布式训练教程指南&#xff1a; 一、PyTorch分布式训练核心概念 数据并行&#xff1a;通过分割数据集实…...

    ubuntu22.04 关于挂在设备为nfts文件格式无法创建软连接的问题

    最近遇到情况&#xff0c;解压工程报错&#xff0c;无法创建软连接 但是盘内还有130G空间&#xff0c;明显不是空间问题&#xff0c;查找之后发现是移动硬盘的文件格式是NTFS&#xff0c;在ubuntu上不好兼容&#xff0c;于是报错。 开贴记录解决方案。 1.确定文件格式 使用命…...

    C++编程:进阶阶段—4.2对象

    目录 4.2 对象特征 4.2.1 构造函数和析构函数 4.2.2 构造函数的分类 4.2.3 拷贝函数调用时机 4.2.4 构造函数调用规则 4.2.5 深拷贝与浅拷贝 4.2.6 初始化列表 4.2.7 类对象作为类成员 4.2.8 静态成员 4.2.9 成员变量和成员函数的存储 4.2.10 this指针 4.2.11 空指针…...

    C++跨平台开发环境搭建全指南:工具链选型与性能优化实战

    C跨平台开发环境搭建全指南&#xff1a;工具链选型与性能优化实战 目录 开发环境搭建工具链选型性能优化实战常见问题排查 开发环境搭建 操作系统环境准备 Windows# 安装Visual Studio Build Tools choco install visualstudio2022buildtools choco install cmake --instal…...

    常见JVM命令

    1. java -XX:PrintCommandLineFlags HelloGC 作用&#xff1a;打印 JVM 启动时的命令行参数&#xff0c;包括用户显式设置的参数和 JVM 自动默认设置的参数。用于确认 JVM 实际使用的配置。 2. java -Xmn10M -Xms40M -Xmx60M -XX:PrintCommandLineFlags -XX:PrintGC -XX:Prin…...

    C语言实现队列数据结构:思路与代码详解

    目录 一、引言 二、整体思路 三、代码模块分析 &#xff08;一&#xff09;头文件包含与宏定义 &#xff08;二&#xff09;数据类型定义 &#xff08;三&#xff09;队列操作函数 1. 队列初始化 2. 队列销毁 3. 入队操作 4. 出队操作 5. 获取队头元素 6…...

    【Docker项目实战】使用Docker与Caddy部署BanBan任务管理工具

    【Docker项目实战】使用Docker部署BanBan任务管理工具 一、BanBan介绍1.1 BanBan简介1.2 主要特点1.3 使用场景二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、下载BanBan镜像五、…...

    AI重构私域增长:从流量收割到终身价值运营的三阶跃迁

    私域运营的AI进化论&#xff1a;内容即服务的三个阶段 随着企业微信生态的成熟&#xff0c;私域运营正经历从"流量收割"到"关系养成"的本质转变。在AIGC技术的推动下&#xff0c;2024年私域场景正式进入**"内容即服务"**的价值共创期&#xff1…...

    es扩容节点以后写入数据量增加1倍

    背景&#xff1a; es扩容一倍的数据节点以后 写入数据量增加1倍 业务反馈业务访问量没增加。 最后定位是监控数据&#xff1a; PUT _cluster/settings {"persistent": {"xpack.monitoring.collection.enabled" : "false"} }这个索引记录的是 节…...

    Go本地缓存设计与实现

    本地缓存是一个项目中很常见的组件。在很多人的眼中就是一个简单的key-value的map存储即可实现&#xff0c;但实际上&#xff0c;设计一个本地缓存需要考虑的问题远比你想象的多&#xff0c;比如说&#xff0c;本地缓存是将数据存储在内存&#xff0c;若数据量激增突破了内存限…...

    04 | 初始化 fastgo 项目仓库

    提示&#xff1a; 所有体系课见专栏&#xff1a;Go 项目开发极速入门实战课&#xff1b;欢迎加入 云原生 AI 实战 星球&#xff0c;12 高质量体系课、20 高质量实战项目助你在 AI 时代建立技术竞争力&#xff08;聚焦于 Go、云原生、AI Infra&#xff09;&#xff1b;本节课最终…...

    Spring中复杂对象的创建方式:FactoryBean、实例工厂与静态工厂全解析

    1.反转控制与依赖注入 控制&#xff1a;对于成员变量赋值的控制权 反转控制&#xff1a;把对于成员变量赋值的控制权&#xff0c;从代码中反转(转移)到Spring工厂和配置文件中完成 好处&#xff1a;解耦合 底层实现&#xff1a;工厂设计模式 依赖注入&#xff1a; 注入&#xf…...

    异或和之和 第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 A 组

    异或和之和 题目来源 第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 A 组 原题链接 蓝桥杯 异或和之和 https://www.lanqiao.cn/problems/3507/learning/ 问题描述 问题分析 要点1:异或运算 概念 异或(Exclusive OR,简称 XOR)是一种数学运算符,常用于逻辑运算与计算机…...

    设计模式 一、软件设计原则

    一、理解设计原则 1、单一原则 1.1 如何理解单一职责原则&#xff08;SRP&#xff09; 单一职责原则&#xff08;Single Responsibility Principle&#xff0c;简称SRP&#xff09;,他要求一个类或模块应该只负责一个特定的功能&#xff0c;这有助于降低类之间的耦合度&#xf…...

    修复Electron项目Insecure Content-Security-Policy(内容安全策略CSP)警告的问题

    将以下代码粘贴进html的<header>标签内 <metahttp-equiv"Content-Security-Policy"content"default-src self; style-src self unsafe-inline; img-src self data:; "> 解释一下上面代码中的属性含义 default-src self&#xff1a;配置加载策…...

    机器人交互系统 部署构建

    环境要求 Ubuntu 20.04 或更高版本ROS Noetic 或兼容版本Python 3.8 安装步骤 1. 安装ROS环境&#xff08;如未安装&#xff09; sudo apt update sudo apt install ros-noetic-desktop-full source /opt/ros/noetic/setup.bash2. 创建工作空间并克隆代码 mkdir -p ~/code…...

    当AI回答问题时,它的“大脑”里在炒什么菜?

    文章目录 1. 拆解订单&#xff1a;AI如何听懂你的“暗号”&#xff1f;2. 调用工具&#xff1a;AI的“万能工具箱”里有什么&#xff1f;3. 知识不够&#xff1f;去“图书馆”现学现卖&#xff01;4. 人类的秘密武器&#xff1a;给AI戴上“镣铐”5. 为什么AI会“胡言乱语”&…...

    linux 软件扩展GPU显存

    概述 共享内存可以通过 Unified Memory&#xff08;统一内存&#xff09;来实现&#xff0c;它允许 CPU 和 GPU 共享相同的内存地址空间&#xff0c;从而方便数据的传输和访问。 利用该技术可解决家用GPU 机器学习时显存不足的问题 &#xff08;注&#xff1a; 虽然解决了爆显…...

    【RabbitMQ】Spring Boot 结合 RabbitMQ 完成应用间的通信

    &#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【中间件】企业级中间件剖析 Spring 框架与 RabbitMQ 的整合主要通过 Spring AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;模块实现&#xff0c;提供了便捷的消息队列开发能力。 引…...

    DeepSeek本地化部署(DeepSeek+olloma+Dify)

    文章目录 概要需要准备的工具Ollama准备内容Docker准备内容Dify准备内容本地访问Dify 概要 提示&#xff1a;本篇文章主要讲述如何部署本地Deepseek私有大模型&#xff0c;使用Windows无显卡环境进行部署 需要准备的工具 Ollama、Docker Desktop 下载地址&#xff1a; Ollama…...

    Spring boot3-WebClient远程调用非阻塞、响应式HTTP客户端

    来吧&#xff0c;会用就行具体理论不讨论 1、首先pom.xml引入webflux依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId> </dependency> 别问为什么因为是响应式....…...

    Ubuntu22.04安装数据

    数据库安装步骤&#xff1a; sudo apt-get update sudo apt install mysql-server mysql-client sudo systemctl start mysql sudo systemctl status mysql &#xff08;1&#xff09;在命令行登录 MySQL 数据库&#xff0c;并使用 mysql 数据库 &#xff08;必须使用这个…...

    【python-uiautomator2】手机上的ATX应用界面报错问题处理:无法提供服务,非am instrument启动

    目录 一、前期准备 1.1 插入设备 1.2 安装atx-agent 二、解决报错&#xff1a;无法提供服务&#xff0c;非am instrument启动 2.1 出现报错 2.2 尝试解决 2.3 最终解决 三、开启ATX的悬浮窗权限 一、前期准备 1.1 插入设备 本地插入待执行设备&#xff0c;待执行设备…...

    自动化测试介绍及学习路线

    目录 一、自动化测试 1.1 自动化测试的概念 1.2 自动化测试的主流领域 接口自动化测试 UI自动化测试 持续集成 二、学习路线 一、自动化测试 1.1 自动化测试的概念 自动化测试是指利用软件工具或脚本来执行测试用例和比较实际结果与预期结果的过程&#xff0c;通过运行…...

    Python:函数(一)

    python函数相关的知识点 1. 函数定义与调用 定义&#xff1a;使用 def 关键字&#xff0c;后接函数名和参数列表。 def greet(name):"""打印问候语&#xff08;文档字符串&#xff09;"""print(f"Hello, {name}!") 调用&#xff1a…...

    qml c++混合编程注意事项

    在Qml和C类进行数据交互时&#xff0c;通用的办法都是注册C到Qml中&#xff0c;但是很多时候C的对象是在C中进行创建&#xff0c;如果在Qml中创建了&#xff0c;数据之间的交互就会出现无法控制的问题。 信号与槽、上下文等都是数据交互的方式&#xff0c;但是当嵌套多层时&…...

    Leetcode6-Z字形变换

    题目链接&#xff1a;6. Z 字形变换 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 定义numRows个字符数组&#xff0c;用于存每一行的字符&#xff1b;再定义一个标志行数的变量cnt&#xff0c;cnt在0到numRows-1之间不停的加一或减一&#xff08;当cnt到0了&am…...

    【eNSP实战】配置交换机端口安全

    拓扑图 目的&#xff1a;让交换机端口与主机mac绑定&#xff0c;防止私接主机。 主机PC配置不展示&#xff0c;按照图中配置即可。 开始配置之前&#xff0c;使用PC1 ping 一遍PC2、PC3、PC4、PC5&#xff0c;让交换机mac地址表刷新一下记录。 LSW1查看mac地址表 LSW1配置端…...

    React.js 基础与进阶教程

    React.js 基础与进阶教程 React.js 是由 Facebook 开发的流行前端 JavaScript 库&#xff0c;专为构建用户界面&#xff08;UI&#xff09;设计&#xff0c;尤其适用于单页面应用&#xff08;SPA&#xff09;。它采用组件化开发模式&#xff0c;使 UI 结构更加清晰、可维护性更…...

    Docker基础入门(一)

    初识Docker 什么是Docker Docker是一个快速交付应用、运行应用的技术&#xff1a; 可以将程序及其依赖、运行环境一起打包为一个镜像&#xff0c;可以迁移到任意Linux操作系统运行时利用沙箱机制形成隔离容器&#xff0c;各个应用互不干扰启动、移除都可以通过一行命令完成&…...

    moment.js时间处理库

    目录 一、moment().isValid()验证时间是否有效 二、moment().second()获取秒数或者设置秒数 三、moment().day()获取星期或者设置星期 四、moment().add()加法操作 五、moment().subtract()减法操作 六、moment.max()最大值 七、moment.min()最小值 八、克隆时间 一、mo…...

    基于hive的电信离线用户的行为分析系统

    标题:基于hive的电信离线用户的行为分析系统 内容:1.摘要 随着电信行业的快速发展&#xff0c;用户行为数据呈现出海量、复杂的特点。为了深入了解用户行为模式&#xff0c;提升电信服务质量和精准营销能力&#xff0c;本研究旨在构建基于 Hive 的电信离线用户行为分析系统。通…...

    循环神经网络(RNN):时序建模的核心引擎与演进之路

    在人工智能处理序列数据的战场上&#xff0c;循环神经网络&#xff08;RNN&#xff09;如同一个能够理解时间的智者。从 2015 年谷歌神经机器翻译系统颠覆传统方法&#xff0c;到 2023 年 ChatGPT 实现对话连续性&#xff0c;这些突破都植根于 RNN 对时序建模的深刻理解。本文将…...

    docker 安装常用镜像

    我们在上篇文章中已经修改了daemon.json 安装镜像时如果search超时就直接pull 安装mysql docker pull mysql:5.7 启动命令 docker run --name mysql-docker -p 3306:3306 -e MYSQL_ROOT_PASSWORDroot1234 -d mysql:5.7 ocker run&#xff1a;运行docker容器命令 --name my…...

    大数据学习(63)- Zookeeper详解

    &&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91e; &#x1f…...

    安卓Compose中accompanist库使用详解

    安卓Compose中accompanist库使用详解 文章目录 安卓Compose中accompanist库使用详解一、Accompanist 库概览二、核心组件详解三、总结与建议 本文首发地址 https://h89.cn/archives/348.html 最新更新地址 https://gitee.com/chenjim/chenjimblog 一、Accompanist 库概览 Acco…...

    Gateway:网关路由与登录鉴权

    在微服务架构中&#xff0c;用户登录和身份校验的处理方式确实与单体应用有所不同。在单体架构中&#xff0c;一旦用户通过身份验证&#xff0c;其会话信息可以在整个应用范围内共享&#xff0c;所有模块都能访问到用户信息。然而&#xff0c;在微服务架构下&#xff0c;每个服…...

    【MySQL篇】MySQL内置函数

    目录 1&#xff0c;日期函数 2&#xff0c;字符串函数 3&#xff0c;数学函数 4&#xff0c;其他函数 实战OJ 1&#xff0c;日期函数 日期类型在之前文章【数据类型】中有描述 传送门&#xff1a;【MySQL篇】数据类型_mysql 数据类型-CSDN博客 函数名称描述current_dat…...

    爬虫案例十三js逆向模拟登录中大网校

    提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、网站分析二、代码 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; js 逆向模拟登录中大网校 提示&#xff1a;以下是本篇文章正文内…...

    高效编程指南:PyCharm与DeepSeek的完美结合

    DeepSeek接入Pycharm 前几天DeepSeek的充值窗口又悄悄的开放了&#xff0c;这也就意味着我们又可以丝滑的使用DeepSeek的API进行各种辅助性工作了。本文我们来聊聊如何在代码编辑器中使用DeepSeek自动生成代码。 注&#xff1a;本文适用于所有的JetBrains开发工具&#xff0c…...

    前馈神经网络 - 参数学习(优化问题)

    神经网络的参数学习比线性模型要更加困难&#xff0c;主要原因有两点:&#xff08;1)非凸优化问题和 &#xff08;2)梯度消失问题&#xff0c;本文我们来学习和分析这两类问题。 一、非凸优化问题 1、非凸优化问题演示&#xff1a; 神经网络的优化问题是一个非凸优化问题。 …...

    AI 大模型统一集成|如何封装多个大模型 API 调用

    &#x1f31f; 在这系列文章中&#xff0c;我们将一起探索如何搭建一个支持大模型集成项目 NexLM 的开发过程&#xff0c;从 架构设计 到 代码实战&#xff0c;逐步搭建一个支持 多种大模型&#xff08;GPT-4、DeepSeek 等&#xff09; 的 一站式大模型集成与管理平台&#xff…...

    C语言学习day25:WinAPI编程进阶06-游戏辅助窗体监视热键讲解

    我们上一章已经绘制出了植物大战僵尸的一个页面 但是我们要怎么样去判断&#xff0c;用户是否按了F1呢。好的接下来就是我们的内容&#xff0c;监视热键。 思路&#xff1a; 我们按下的是键盘&#xff0c;因此我们得用键盘消息&#xff0c;也是&#xff1a;WM_KEYDOWN 同时要…...

    JVM常用概念之常量

    问题 final修饰的字段就一定是不能重新赋值吗? 基础知识 常量变量是使用常量表达式初始化的原始类型或 String 类型的最终变量。变量是否为常量变量可能对类初始化、二进制兼容性和明确赋值有影响。 —Java 语言规范 实验 用例源码-重新赋值 import java.lang.reflect.Fie…...

    【Vue】el-dialog的2种封装方法(父子组件双向通信),$emit触发父事件/.sync修饰符双向绑定

    🤵 作者:coderYYY 🧑 个人简介:前端程序媛,目前主攻web前端,后端辅助,其他技术知识也会偶尔分享🍀欢迎和我一起交流!🚀(评论和私信一般会回!!) 👉 个人专栏推荐:《前端项目教程以及代码》 前言 在现代Vue.js开发中,el-dialog组件作为ElementUI库中的一个…...