【Spring进阶系列丨第九篇】基于XML的面向切面编程(AOP)详解
文章目录
- 一、基于XML的AOP
- 1.1、打印日志案例
- 1.1.1、beans.xml中添加aop的约束
- 1.1.2、定义Bean
- 1.2、定义记录日志的类【切面】
- 1.3、导入AOP的依赖
- 1.4、主配置文件中配置AOP
- 1.5、测试
- 1.6、切入点表达式
- 1.6.1、访问修饰符可以省略
- 1.6.2、返回值可以使用通配符,表示任意返回值
- 1.6.3、包名可以使用通配符表示任意包。有几级包,就几个*
- 1.6.4、类名也可以用*
- 1.6.5、方法也可以用*
- 1.6.6、参数列表
- 1.6.7、全通配符写法
- 1.6.8、使用最多的写法
- 1.7、通知类型的使用
- 1.7.1、在日志类中新增通知方法
- 1.7.2、配置AOP
- 1.7.3、测试
- 1.8、切入点表达式改进
- 1.8.1、方式一
- 1.8.2、方式二
- 1.9、环绕通知
- 1.9.1、在日志记录类中新增环绕通知
- 1.9.2、AOP配置环绕通知
- 1.9.3、测试1
- 1.9.4、解决
- 好书推荐

一、基于XML的AOP
1.1、打印日志案例
1.1.1、beans.xml中添加aop的约束
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd">
</beans>
1.1.2、定义Bean
package cn.bdqn.domain;
public class User {}
package cn.bdqn.service;
public interface UserService {// 保存用户public void save(User user);// 根据id查询用户public User queryById(Integer id);// 查询全部用户public List<User> queryAll();
}
package cn.bdqn.service;
public class UserServiceImpl implements UserService{// 保存用户public void save(User user){}// 根据id查询用户public User queryById(Integer id){return new User();}// 查询全部用户public List<User> queryAll(){return new ArrayList<User>();}
}
1.2、定义记录日志的类【切面】
package cn.bdqn.advice;// 定义记录日志的类,这个类就封装了我们所有的公共的代码
public class Logger {// 该方法的作用是在切入点方法执行之前执行public void beforePrintLog(){System.out.println("开始打印日志啦");}
}
1.3、导入AOP的依赖
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.4</version>
</dependency>
1.4、主配置文件中配置AOP
<beans><!-- 1、注册UserServiceImpl这个Bean --><bean id="userService" class="cn.bdqn.service.UserServiceImpl"/><!-- 2、以下操作都是Spring基于XML的AOP配置步骤2.1 把通知/增强Bean也需要注册到Spring容器中2.2 使用<aop:config/>标签来去声明开始AOP的配置了2.3 使用<aop:aspect/>标签来去表示开始配置切面了可以想一下:既然要配置切面,那切面就是切入点和通知的结合,所以肯定需要配置切入点和通知这两部分id属性:是给切面提供一个唯一标识ref属性:是指定通知类bean的Id。2.4 在<aop:aspect/>标签的内部使用对应标签来配置通知的类型前置通知/后置通知/异常通知/最终通知需求:beforePrintLog方法在切入点方法执行之前之前:所以是前置通知前置通知:<aop:before/>method属性:用于指定Logger类中哪个方法是前置通知pointcut属性:用于指定切入点表达式,该表达式的含义指的是对业务层中哪些方法增强3、切入点表达式的写法:关键字:execution(表达式)表达式:访问修饰符 方法返回值 包名1.包名2...类名.方法名(参数列表)需求:我现在就想对UserServiceImpl类中的queryAll方法进行拦截public java.util.List cn.bdqn.service.UserServiceImpl.queryAll()--><!-- 2.1 把通知/增强Bean也需要注册到Spring容器中 --><bean id="logger" class="cn.bdqn.advice.Logger"/><!-- 2.2 使用此标签来去声明开始AOP的配置了--><aop:config><!--配置切面 --><aop:aspect id="loggerAdvice" ref="logger"><!-- 配置通知的类型,并且建立增强方法和切入点方法的关联--><aop:before method="beforePrintLog" pointcut="execution(public java.util.List cn.bdqn.service.UserServiceImpl.queryAll())"/></aop:aspect></aop:config>
</beans>
1.5、测试

@Test
public void testUserServiceImpl() throws Exception{ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");UserService userService = (UserService) ac.getBean("userService");userService.queryAll();
}
1.6、切入点表达式
问题:我们上面的案例经过测试发现确实在调用业务方法之前增加了日志功能,但是问题是仅仅能针对某一个业务方法进行增强,而我们的业务方法又有可能有很多,所以显然一个一个的去配置很麻烦,如何更加灵活的去配置呢?这个就需要使用到切入点表达式
语法:execution(表达式)
访问修饰符 方法返回值 包名1.包名2...类名.方法名(参数列表)
1.6.1、访问修饰符可以省略
// 完整写法
public java.util.List cn.bdqn.service.UserServiceImpl.queryAll())// 标准写法
java.util.List cn.bdqn.service.UserServiceImpl.queryAll())
1.6.2、返回值可以使用通配符,表示任意返回值
* cn.bdqn.service.UserServiceImpl.queryAll())
1.6.3、包名可以使用通配符表示任意包。有几级包,就几个*
* *.*.*.UserServiceImpl.queryAll())
但是对于包来说,连续的写3个*,显然也是麻烦的,那么可以使用“…”表示当前包及其子包。
// 表示的是任意包下的只要有UserServiceImpl类都会对queryAll方法进行增强
* *..UserServiceImpl.queryAll())
1.6.4、类名也可以用*
* *..*.queryAll()
1.6.5、方法也可以用*
* *..*.*()
1.6.6、参数列表
写法1、可以直接写数据类型:基本类型直接写名称 int、double引用类型写包名.类名的方式 java.lang.String、java.util.List
写法2、可以使用通配符表示任意类型前提是必须要有参数。写法3、使用..可以使用..表示有无参数均可,如果有参数则表示的可以是任意类型
1.6.7、全通配符写法
* *..*.*(..)
1.6.8、使用最多的写法
实际中的写法:切到业务层实现类下的所有方法。即:
* com.bdqn.service.impl.*.*(..)
1.7、通知类型的使用
1.7.1、在日志类中新增通知方法
// 定义记录日志的类,这个类就封装了我们所有的公共的代码
public class Logger {// 该方法的作用是在切入点方法执行之前执行public void beforePrintLog(){System.out.println("前置通知(beforePrintLog):开始打印日志啦");}// 该方法的作用是在切入点方法执行之后执行public void afterReturningPrintLog(){System.out.println("后置通知(afterReturningPrintLog):业务方法执行完了,日志打印");}// 该方法的作用是在切入点方法执行出错后执行public void afterThrowingPrintLog(){System.out.println("异常通知(afterThrowingPrintLog):业务方法出现异常了,日志打印");}// 该方法的作用是在切入点方法执行之后不管有没有错误,都最终要执行public void afterPrintLog(){System.out.println("最终通知(afterPrintLog):业务方法不管有没有异常了,日志打印");}
}
1.7.2、配置AOP
<beans><!-- 2.1 把通知/增强Bean也需要注册到Spring容器中 --><bean id="logger" class="cn.bdqn.advice.Logger"/><!-- 2.2 使用此标签来去声明开始AOP的配置了--><aop:config><!--配置切面 --><aop:aspect id="loggerAdvice" ref="logger"><!-- 配置前置通知:在切入点方法执行之前执行--><aop:before method="beforePrintLog" pointcut="execution(* cn.bdqn.service.UserServiceImpl.queryAll())"/><!-- 后置通知:在切入点方法正常执行之后值。它和异常通知永远只能执行一个--><aop:after-returning method="afterReturningPrintLog" pointcut="execution(* cn.bdqn.service.UserServiceImpl.queryAll())"/><!--配置异常通知:在切入点方法执行产生异常之后执行。它和后置通知永远只能执行一个--><aop:after-throwing method="afterThrowingPrintLog" pointcut="execution(* cn.bdqn.service.UserServiceImpl.queryAll())"/><!--配置最终通知:无论切入点方法是否正常执行它都会在其后面执行--><aop:after method="afterPrintLog"pointcut="execution(* cn.bdqn.service.UserServiceImpl.queryAll())"/></aop:aspect></aop:config>
</beans>
1.7.3、测试
@Test
public void testUserServiceImpl() throws Exception{ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");UserService userService = (UserService) ac.getBean("userService");userService.queryAll();
}
/***前置通知(beforePrintLog):开始打印日志啦查询全部用户执行啦后置通知(afterReturningPrintLog):业务方法执行完了,日志打印最终通知(afterPrintLog):业务方法不管有没有异常了,日志打印
**/
1.8、切入点表达式改进
通过11.7可以发现,我们在配置文件中配置了四种通知类型,其中的pointcut配置的是切入点表达式,发现是一模一样的,那么有没有一种改进写法呢?可以将表达式抽取出来,将来可以引用。
1.8.1、方式一
<beans><!-- 1、注册UserServiceImpl这个Bean --><bean id="userService" class="cn.bdqn.service.UserServiceImpl"/><!-- 2、以下操作都是Spring基于XML的AOP配置步骤--><!-- 2.1 把通知/增强Bean也需要注册到Spring容器中 --><bean id="logger" class="cn.bdqn.advice.Logger"/><!-- 2.2 使用此标签来去声明开始AOP的配置了--><aop:config><!--配置切面 --><aop:aspect id="loggerAdvice" ref="logger"><!--配置切入点表达式id属性用于指定切入点表达式的唯一标识。expression属性用于指定表达式内容此标签写在aop:aspect标签内部只能当前切面使用。--><aop:pointcut id="loggerPt" expression="execution(* cn.bdqn.service.UserServiceImpl.queryAll())"/><!-- 配置前置通知:在切入点方法执行之前执行--><aop:before method="beforePrintLog" pointcut-ref="loggerPt"/><!-- 后置通知:在切入点方法正常执行之后值。它和异常通知永远只能执行一个--><aop:after-returning method="afterReturningPrintLog" pointcut-ref="loggerPt"/><!--配置异常通知:在切入点方法执行产生异常之后执行。它和后置通知永远只能执行一个--><aop:after-throwing method="afterThrowingPrintLog" pointcut-ref="loggerPt"/><!--配置最终通知:无论切入点方法是否正常执行它都会在其后面执行--><aop:after method="afterPrintLog" pointcut-ref="loggerPt"/></aop:aspect></aop:config>
</beans>
1.8.2、方式二
对于方式一,我们将aop:pointcut标签写在了aop:aspect里面,这样的话这切入点表达式只能被当前的切面使用,而如果其他切面想使用就使用不到了,所以我们可以把这个切入点表示再定义到外面。
<beans><bean id="userService" class="cn.bdqn.service.UserServiceImpl"/><!-- 2、以下操作都是Spring基于XML的AOP配置步骤--><!-- 2.1 把通知/增强Bean也需要注册到Spring容器中 --><bean id="logger" class="cn.bdqn.advice.Logger"/><!-- 2.2 使用此标签来去声明开始AOP的配置了--><aop:config><!--配置切入点表达式id属性用于指定切入点表达式的唯一标识。expression属性用于指定表达式内容此标签写在aop:aspect标签外面,那么所有的切面都可以使用。--><aop:pointcut id="loggerPt" expression="execution(* cn.bdqn.service.UserServiceImpl.queryAll())"/><!--配置切面 --><aop:aspect id="loggerAdvice" ref="logger"><!-- 配置前置通知:在切入点方法执行之前执行--><aop:before method="beforePrintLog" pointcut-ref="loggerPt"/><!-- 后置通知:在切入点方法正常执行之后值。它和异常通知永远只能执行一个--><aop:after-returning method="afterReturningPrintLog" pointcut-ref="loggerPt"/><!--配置异常通知:在切入点方法执行产生异常之后执行。它和后置通知永远只能执行一个--><aop:after-throwing method="afterThrowingPrintLog" pointcut-ref="loggerPt"/><!--配置最终通知:无论切入点方法是否正常执行它都会在其后面执行--><aop:after method="afterPrintLog" pointcut-ref="loggerPt"/></aop:aspect></aop:config>
</beans>
1.9、环绕通知
1.9.1、在日志记录类中新增环绕通知
public class Logger {// 环绕通知public void aroundPrintLog(){System.out.println("环绕通知....aroundPrintLog.....");}
}
1.9.2、AOP配置环绕通知
<beans><!-- 1、注册UserServiceImpl这个Bean --><bean id="userService" class="cn.bdqn.service.UserServiceImpl"/><!-- 2、以下操作都是Spring基于XML的AOP配置步骤--><!-- 2.1 把通知/增强Bean也需要注册到Spring容器中 --><bean id="logger" class="cn.bdqn.advice.Logger"/><!-- 2.2 使用此标签来去声明开始AOP的配置了--><aop:config><!-- 配置切入点表达式 --><aop:pointcut id="loggerPt" expression="execution(* cn.bdqn.service.UserServiceImpl.queryAll())"/><!--配置切面 --><aop:aspect id="loggerAdvice" ref="logger"><!-- 环绕通知--><aop:around method="aroundPrintLog" pointcut-ref="loggerPt"/></aop:aspect></aop:config>
</beans>
1.9.3、测试1
@Test
public void testUserServiceImpl() throws Exception{ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");UserService userService = (UserService) ac.getBean("userService");userService.queryAll();
}
/**环绕通知....aroundPrintLog.....发现:仅仅打印了环绕通知的代码。当我们配置了环绕通知之后,切入点方法没有执行,而通知方法执行了
*/
1.9.4、解决
Spring框架为我们提供了一个接口:ProceedingJoinPoint。该接口有一个方法proceed(),此方法就相当于明确调用切入点方法。该接口可以作为环绕通知的方法参数,在程序执行时,spring框架会为我们提供该接口的实现类供我们使用。
public class Logger {// 环绕通知public Object aroundPrintLog(ProceedingJoinPoint pjp){Object result = null;try{Object[] args = pjp.getArgs();System.out.println(pjp.getSignature().getName());System.out.println("前置");result = pjp.proceed(args);System.out.println("后置");return result;}catch (Throwable t){System.out.println("异常");throw new RuntimeException(t);}finally {System.out.println("最终");}}
}
/**环绕通知:它是spring框架为我们提供的一种可以在代码中手动控制增强方法何时执行的方式。
*/
好书推荐

《深入浅出Spring Boot 3.x》

作者简介
杨开振——长期从事Java开发工作,拥有近十年的Java开发经验,目前就职于一家互联网金融公司,担任互联网软件开发职位。
IT技术的狂热爱好者,热衷于Java互联网方向的软件技术开发与研究。熟练掌握Java基础、软件开发设计模式和数据库相关知识,对Spring、MyBatis等主流Java开源框架有深入研究。
购书链接:点此进入

相关文章:
【Spring进阶系列丨第九篇】基于XML的面向切面编程(AOP)详解
文章目录 一、基于XML的AOP1.1、打印日志案例1.1.1、beans.xml中添加aop的约束1.1.2、定义Bean 1.2、定义记录日志的类【切面】1.3、导入AOP的依赖1.4、主配置文件中配置AOP1.5、测试1.6、切入点表达式1.6.1、访问修饰符可以省略1.6.2、返回值可以使用通配符,表示任…...
学习记录:转发和重定向
转发(Forward)和重定向(Redirect)是两种不同的 Web 请求处理方式,它们在功能和行为上有着显著的区别。 区别 转发(Forward): 服务器内部跳转:转发是服务器内部的行为&…...
实现(图像、视频等)数据上云存储
实现(图像、视频等)数据上云存储 实现(图像、视频等)数据上云存储通常涉及以下几个步骤: 选择云存储服务商: 根据您的需求、预算、地域覆盖、数据安全性、服务稳定性等因素,选择一家合适的云存储…...
LeetCode 454.四数相加II
LeetCode 454.四数相加II 1、题目 题目链接:454. 四数相加 II - 力扣(LeetCode) 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <…...
GoogleNet网络训练集和测试集搭建
测试集和训练集都是在之前搭建好的基础上进行修改的,重点记录与之前不同的代码。 还是使用的花分类的数据集进行训练和测试的。 一、训练集 1、搭建网络 设置参数:使用辅助分类器,采用权重初始化 net GoogleNet(num_classes5, aux_logi…...
将数字状态码在后台转换为中文状态
这是我们的实体类 可以看出我们的状态status是2如过返回到前端我们根本不知道2代表的是什么,所以我们需要再这里将数字转换成能看懂的中文状态,首先我们创建一个枚举类 先将我们状态码所对应的中文状态枚举出来,然后创建一个静态方法&#…...
2017NOIP普及组真题 4. 跳房子
线上OJ: 一本通:http://ybt.ssoier.cn:8088/problem_show.php?pid1417\ 核心思想 首先、本题中提到 “ 至少 要花多少金币改造机器人,能获得 至少 k分 ”。看到这样的话语,基本可以考虑要使用 二分答案。 那么,本题中…...
网络与 Internet因特网的基本概念
目录 网络Internet (互联网或互连网)Internet(因特网)待续、更新中 网络 指将分布在不同地理位置的、相同或不同类型的网络通过网络互连设备(中继器、网桥、路由器或网关等)相互连接,形成一个范…...
vue-router 中 router-link 与 a 标签的区别
文章目录 前言 a标签定义 router-link定义 总结 前言 vue-router 中 router-link 与 a 标签的区别 a标签定义 <a> 标签定义超链接,用于从一张页面链接到另一张页面。 从一张页面跳转到另一张页面,但从这里来说就违背了多视图的单页Web应用这个…...
MySQL基础知识——MySQL事务
事务背景 什么是事务? 一组由一个或多个数据库操作组成的操作组,能够原子的执行,且事务间相互独立; 简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。 注:MyS…...
【架构方法论(一)】架构的定义与架构要解决的问题
文章目录 一. 架构定义与架构的作用1. 系统与子系统2. 模块与组件3. 框架与架构4. 重新定义架构:4R 架构 二、架构设计的真正目的-别掉入架构设计的误区1. 是为了解决软件复杂度2. 简单的复杂度分析案例 三. 案例思考 本文关键字 架构定义 架构与系统的关系从业务逻…...
基于springboot实现人口老龄化社区服务与管理系统项目【项目源码+论文说明】计算机毕业设计
基于springboot实现人口老龄化社区服务与管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了人口老龄化社区服务与管理平台的开发全过程。通过分析人口老龄化社区服务与管理平台方面的不足ÿ…...
代码随想录算法训练营第三十七天| LeetCode 738.单调递增的数字、总结
一、LeetCode 738.单调递增的数字 题目链接/文章讲解/视频讲解:https://programmercarl.com/0738.%E5%8D%95%E8%B0%83%E9%80%92%E5%A2%9E%E7%9A%84%E6%95%B0%E5%AD%97.html 状态:已解决 1.思路 如何求得小于等于N的最大单调递增的整数?98&am…...
C++动态内存管理 解剖new/delete详细讲解(operator new,operator delete)
讨厌抄我作业和不让我抄作业的人 讨厌插队和不让我插队的人 讨厌用我东西和不让我用东西的人 讨厌借我钱和不借给我钱的人 讨厌开车加塞和不让我加塞的人 讨厌内卷和打扰我内卷的人 一、C中动态内存管理 1.new和delete操作内置类型 2.new和delete操作自定义类型 二、operat…...
python-re正则笔记0.2.0
1. 匹配linux文件路径 from re import match, search,findall str"sh refreshConfig.sh /opt/client/ccc.txt /opt/client/ccc.dfs 胜多负少的"patter1"\/.\.\w" print(findall(patter1, str))""" [/opt/client/ccc.txt /opt/client/ccc…...
.NET SignalR Redis实时Web应用
环境 Win10 VS2022 .NET8 Docker Redis 前言 什么是 SignalR? ASP.NET Core SignalR 是一个开放源代码库,可用于简化向应用添加实时 Web 功能。 实时 Web 功能使服务器端代码能够将内容推送到客户端。 适合 SignalR 的候选项: 需要从服…...
【热门话题】常见分类算法解析
🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 💫个人格言: "如无必要,勿增实体" 文章目录 常见分类算法解析1. 逻辑回归(Logistic Regression)2. 朴…...
有效利用MRP能为中小企业带来什么?
在离散制造企业,主流的生产模式主要为面向订单生产和面向库存生产(又称为预测生产),在中小企业中,一般为面向订单生产,也有部分面向库存和面向订单混合的生产方式(以面向订单为主,面…...
InternlM2
第一次作业 基础作业 进阶作业 1. hugging face下载 2. 部署 首先,从github上git clone仓库 https://github.com/InternLM/InternLM-XComposer.git然后里面的指引安装环境...
2024-12.python高级语法
异常处理 首先我们要理解什么叫做**"异常”**? 在程序运行过程中,总会遇到各种各样的问题和错误。有些错误是我们编写代码时自己造成的: 比如语法错误、调用错误,甚至逻辑错误。 还有一些错误,则是不可预料的错误…...
【24年最新算法】首发CPO-XGBoost回归+交叉验证 基于冠豪猪优化算法-XGBoost多变量回归预测
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...
硬核盘点|2026年好用AI论文写作工具榜单,毕业论文免费写还合规
2026 年实测 10 款主流 AI 论文工具,千笔AI以全流程覆盖 语义级降重 免费查重领跑综合榜;ThouPen 稳坐留学生毕业全流程工具头把交椅;免费工具中DeepSeek Scholar、豆包学术版表现亮眼,30 分钟即可生成万字高质量初稿࿰…...
SDMatte Web端体验优化:首屏加载速度与模型预热机制说明
SDMatte Web端体验优化:首屏加载速度与模型预热机制说明 1. 引言 在电商、设计、内容创作等领域,高质量的图像抠图已经成为刚需。SDMatte作为一款专注于复杂边缘和透明物体处理的AI抠图工具,其Web端体验直接影响用户的使用感受。本文将详细…...
AIGlasses_for_navigation免配置环境:预置ffmpeg+opencv+torchvision全栈
AIGlasses_for_navigation免配置环境:预置ffmpegopencvtorchvision全栈 1. 引言:让AI视觉开发变得简单 如果你曾经尝试过搭建一个完整的AI视觉处理环境,一定知道那是个多么痛苦的过程:安装CUDA、配置ffmpeg、编译OpenCV、处理各…...
5分钟搞定OpenClaw+GLM-4.7-Flash:星图平台一键部署体验
5分钟搞定OpenClawGLM-4.7-Flash:星图平台一键部署体验 1. 为什么选择云端部署OpenClaw 作为一个长期折腾本地AI部署的技术爱好者,我深知在个人电脑上配置OpenClaw的痛处。从Node.js版本冲突到模型权重下载失败,再到各种依赖库缺失…...
AI智能应用开发(Java)从起点到终点-面向对象
自定义对象Java中自定义对象的必要性就像我们之前用的Scanner 和Random 都是java里面已经写好的对象,直接拿来用就好了,不用再自己写一大串代码来实现键盘录入和随机数的需求,但是有些需求是java中没有定义和写好的,,但…...
建议收藏|盘点2026年顶尖配置的AI论文平台
一天写完毕业论文在2026年已不再是天方夜谭。以下是2026年最炸裂、实测能大幅提速的AI论文平台,覆盖选题构思、文献分析、内容生成、格式排版四大核心场景,帮你高效搞定论文。 一、全流程王者:一站式搞定论文全链路(一天定稿首选&…...
C++ 内存分配器工作原理
C内存分配器工作原理探秘 在C中,动态内存管理是程序性能优化的关键环节,而内存分配器则是幕后英雄。它负责在堆上高效分配和释放内存,直接影响程序的运行效率和资源利用率。无论是标准库中的std::allocator,还是自定义的高性能分…...
如何守护.NET应用源代码安全?Obfuscar开源混淆方案深度解析
如何守护.NET应用源代码安全?Obfuscar开源混淆方案深度解析 【免费下载链接】obfuscar Open source obfuscation tool for .NET assemblies 项目地址: https://gitcode.com/gh_mirrors/ob/obfuscar 在数字化时代,.NET应用程序面临着严峻的源代码安…...
用了Qoder写代码飞快,联调时却总因字段不一致返工,问题出在哪?
发版前夜,前端字段对不上后端接口,联调卡了整晚。这种场景在 AI Coding 普及后并不罕见,不少团队用了 Qoder 觉得生成快、跑通快,可一旦要改需求,系统就僵住了。看似工具背锅,其实根子往往不在速度…...
