尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Spring Event事件机制详解:从解耦到异步与事务监听实战
简介这是一份Spring事件机制示例工程面向需要掌握Spring框架中事件发布与监听机制的Java开发者。项目基于Maven构建采用标准Spring项目结构覆盖事件定义、事件发布、监听方式、执行顺序控制、广播模式、线程模型等核心知识点。压缩包共75个文件以25个Java源码和25个编译后的Class文件为主另有Maven配置文件、Spring配置文件和工程配置文件便于直接导入集成开发环境运行调试。通过查看源码和运行示例可以直观理解自定义事件类、使用注解声明监听器或实现监听器接口完成事件监听并学习控制监听器执行顺序、异步处理、自定义事件广播器等进阶用法。资源整体仅44KB轻量完整适合作为Spring事件机制从理论到实践的系统性参考资料。目前已有680人学习下载对于希望快速上手Spring事件并在实际项目中实现模块解耦的开发者具有较高参考价值。1. Spring Event 示例业务解耦里最容易被低估的事件机制后端开发到一定阶段都会遇到同一个问题一个核心方法里堆了太多“顺带要做的事”。拿订单创建来说光入库还不够还要发通知、扣库存、写操作日志全写在同一个方法里代码越堆越长改一处就要重新测整条链路。Spring Event 是 Spring 框架内置的事件发布与监听机制它把“主流程”和“后续处理”拆开发布方只管把事件丢出去监听方按类型接住后各自处理彼此完全解耦。我这个 spring event 示例笔记就是围绕这套机制做的可运行工程从最小链路到异步与事务监听都有完整代码适合正在做业务拆解、想摆脱冗长 if-else 链路的开发者也适合刚学 Spring 的入门者——照着跑一遍就能理解事件机制到底在解决什么问题。2. 事件机制原理与最小工程三个角色一条链路2.1 事件、监听器、发布器三个角色的职责边界Spring Event 的整套体系只有三个核心角色事件Event、监听器Listener、发布器Publisher。事件就是一个普通 Java 对象通常继承 ApplicationEvent代表业务里“已经发生的某件事”监听器是被 Spring 管理的 Bean它订阅特定类型的事件并执行后续逻辑发布器则是触发的那一方拿到 ApplicationEventPublisher 后调用 publishEvent 把事件广播出去。三者的调用过程可以这样理解业务代码调用 publisher.publishEvent(event)Spring 容器找到所有匹配该事件类型的监听器依次执行它们的监听方法。这里有个关键前提必须讲清楚——默认情况下这个调用是同步的。发布方线程会等所有监听器逻辑执行完才会继续往下走。很多第一次接触 Spring Event 的开发者会误以为事件机制天然就是异步的其实恰恰相反同步执行才是默认行为异步需要额外配置。之所以设计成同步是因为 Spring 内部默认使用 SimpleApplicationEventMulticaster 这个广播器它只是简单地循环调用监听器没有为监听器单独分配线程。明白了这一点后面理解 Async 和事务监听器为什么能改变行为就顺理成章了。从职责边界来看发布方不需要知道有哪些监听器存在监听方也不需要知道事件是谁发布的双方只通过事件类型建立契约。这个设计让主业务流程可以完全忽略“后续处理”的细节新增一个监听器去响应已有事件发布代码一行都不用动。2.2 为什么用自定义事件类而不是直接传 String工程里偶尔会看到有人这么写publisher.publishEvent(order_created)监听器里用 if (order_created.equals(event)) 做分支。这种写法的直接问题有两个一是字符串没有类型约束拼错一个字母程序不会报错只有跑起来才知道事件没触发二是一切事件都混在一个通道里监听器要做大量的字符串判断才能区分业务代码很快就变成一坨。自定义事件类把类型和数据结构一起定了下来继承 ApplicationEvent类名就是事件语义字段就是业务上下文。监听器方法的参数类型直接决定了它能收到什么事件不需要任何 if 判断。写到这里你应该能理解事件类本质上是一份轻量的接口契约——发布方和监听方都对着这个契约开发。我给事件类加过几条约定供你参考。字段用 final 修饰创建后不可变避免多个监听器互相改数据类名使用“业务动作过去式 Event”的格式比如 OrderCreatedEvent、PaymentSuccessEvent一眼能看出发生了什么事件里不写业务逻辑只做数据载体处理逻辑全部放在监听器里。这几条约定看着简单但真的能省掉不少沟通成本。2.3 最小可跑工程三种角色组合成一条完整链路直接用代码把完整链路跑一遍。首先是事件类package com.demo.event; import org.springframework.context.ApplicationEvent; public class OrderCreatedEvent extends ApplicationEvent { private final Long orderId; private final Long userId; public OrderCreatedEvent(Object source, Long orderId, Long userId) { super(source); this.orderId orderId; this.userId userId; } public Long getOrderId() { return orderId; } public Long getUserId() { return userId; } }事件类继承 ApplicationEvent构造函数里必须先调用 super(source)。这个 source 是事件的来源对象传当前发布者实例即可绝大多数监听业务根本用不到它。真正承载业务的是 orderId 和 userId 这两个字段用 final 修饰事件一旦创建内容就不能再改保证多个监听器拿到的是同一份数据。接下来是监听器package com.demo.event; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; Component public class OrderEventListener { EventListener public void onOrderCreated(OrderCreatedEvent event) { System.out.println(收到订单事件, orderId event.getOrderId() , userId event.getUserId()); // 后续处理发通知、写日志、更新缓存都放到这里 } }EventListener 注解是目前最推荐的监听器写法不需要实现 ApplicationListener 接口只要在方法参数里写上具体的事件类型Spring 容器启动时就会自动把这个方法注册为对应事件的监听器。方法名可以随意取参数类型才是 Spring 做事件分发的依据。注意监听器本身必须是 Spring Bean所以类上要有 Component否则根本不会被扫描注册。最后是发布器package com.demo.service; import com.demo.event.OrderCreatedEvent; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; Service public class OrderService { private final ApplicationEventPublisher publisher; public OrderService(ApplicationEventPublisher publisher) { this.publisher publisher; } public void createOrder(Long orderId, Long userId) { // 这里放订单入库逻辑 publisher.publishEvent(new OrderCreatedEvent(this, orderId, userId)); } }ApplicationEventPublisher 由 Spring 自动注入不需要额外配置。publishEvent 方法把事件广播给所有匹配的监听器然后同步等待监听器执行结束。这段代码里发布方没有任何关于监听器的信息这就是解耦的核心——你往系统里加一个新的监听器OrderService 一行都不用动。如果只是个简单的 Spring Boot 工程启动类长这样package com.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class EventDemoApplication { public static void main(String[] args) { SpringApplication.run(EventDemoApplication.class, args); } }这个启动类不包含任何事件相关配置Spring 的包扫描会自动发现 Component 和 EventListener包路径扫对链路就能跑起来。我第一次写事件示例时还特意去找“事件配置类”后来发现根本不需要这也是 Spring Event 容易被低估的原因——入门太简单了以至于很多人没意识到它能在复杂业务里解决多大问题。2.4 是否需要统一基类泛型事件的取舍有些团队喜欢给自己所有事件定义一个统一父类比如 BaseEvent用来承载时间戳、操作人等公共字段。这种做法的价值在于统一元数据但代价是事件继承链变复杂监听器参数的匹配范围会被拉宽。Spring 分发事件时按实际事件对象和监听器参数类型做匹配监听器参数是父类时子类事件也会被接住。这意味着只要你写一个监听 BaseEvent 的 EventListener所有继承它的事件都会跑到这个方法里来很容易在枚举事件类型时引入误匹配。有些项目为了让所有事件走同一套日志链路过度依赖这个机制结果监听器代码里全是 instanceof 判断事件机制被用成了反模式。我的建议是只有确实需要统一收集元数据时才引入 BaseEvent否则保持事件类扁平一个事件对应一个类语义清楚后续扩展也不容易被继承关系绊住。3. 事件对象设计与监听器注册示例里的实战约定3.1 发布事件的两种姿势与依赖选择发布事件的方式有几种实际项目里最常见的两种值得对比一下。第一种是直接注入 ApplicationEventPublisherService public class UserService { private final ApplicationEventPublisher publisher; public UserService(ApplicationEventPublisher publisher) { this.publisher publisher; } public void register(Long userId) { publisher.publishEvent(new UserRegisteredEvent(this, userId)); } }第二种是通过 ApplicationContext 发布Service public class UserService { private final ApplicationContext context; public UserService(ApplicationContext context) { this.context context; } public void register(Long userId) { context.publishEvent(new UserRegisteredEvent(this, userId)); } }两种写法发布事件的效果完全一样因为 ApplicationContext 本身就实现了 ApplicationEventPublisher 接口。区别在于依赖的宽窄。我基本上只推荐第一种理由很实际ApplicationEventPublisher 的接口面比 ApplicationContext 小得多测试时 mock 起来更轻。如果你在大项目里做过组件设计应该知道依赖拉得越窄模块之间的耦合就越低这也是事件机制想解决的原始诉求。3.2 事件粒度传 ID 还是传整个对象事件里该放什么数据这是设计事件对象时第一个要回答的问题。常见的反例是把整个实体对象塞进事件publisher.publishEvent(new OrderCreatedEvent(this, order));同步监听器里这样用问题不大因为监听执行时事务还活着实体还能正常访问。但事件机制的价值恰恰在于异步和事务监听一旦把监听器改成 TransactionalEventListener(AFTER_COMMIT)实体已经脱离了事务上下文再访问懒加载字段就会抛 LazyInitializationException。这种问题很难当场发现往往要等线上某个模块访问了特定字段才翻车。我现在的习惯是事件里只放业务标识orderId、userId、productId 这类 ID不放实体引用。监听器需要完整数据时自己去查询一次确保拿到的是当前状态也不依赖事务上下文。这样做还能保留一个额外好处事件对象以后要转 JSON 出去走消息队列序列化简单干净不会因为嵌套实体导致数据泄漏或跨系统问题。3.3 监听器注册的三种方式和顺序控制监听器的注册有三条路径我列个对比你会看得更清楚实现 ApplicationListener 接口重写 onApplicationEvent 方法在普通方法上标注 EventListener在配置类里手动 new 监听器并加入 ApplicationEventMulticaster。实现接口是早期版本的主流方式现在项目里很少见因为一个类只能服务一种事件类型代码结构上也比注解方式重。EventListener 是当前最常用的写法一个类里可以写多个监听方法各方法通过参数类型区分事件清晰好维护。手动注册适合启动阶段需要动态计算监听器对象的场景日常开发基本用不上。多个监听器监听同一个事件时执行顺序默认由容器内部决定不控制的话你永远搞不清楚谁先谁后。要控制顺序直接在监听方法上加注解Component public class OrderListeners { EventListener Order(1) public void writeLog(OrderCreatedEvent event) { System.out.println(第一步写日志); } EventListener Order(2) public void sendNotify(OrderCreatedEvent event) { System.out.println(第二步发通知); } }Order 数字越小优先级越高。需要说明的是这里的顺序控制只在同步监听场景下有意义一旦监听器改成异步执行代码执行顺序就跟注解顺序没有必然关系所以别把核心业务逻辑押在异步监听器的执行顺序上。3.4 事件命名与字段规约让事件类成为契约事件类是发布方和监听方之间的契约命名和字段设计值得投入一点心思。类名建议采用“过去式动作 Event”OrderCreatedEvent、PaymentSuccessEvent、FileUploadFinishedEvent看一眼就知道发生了什么而且在日志搜索里也更容易定位。字段方面只放业务标识不放实体字段用 final构造函数一次性赋值每个事件类写一个 toString方便日志打印。事件类里不要放业务方法它不是领域模型纯粹是数据的载体。要不要在事件里放一个 processingFlag 标记“是否已处理”我劝你别这么做这会破坏事件的不可变语义后面清理历史逻辑时你会很痛苦。把处理状态放在监听器或者单独的状态存储里更合理。其实事件对象设计的道理跟接口设计完全一致最小化数据、明确语义、稳定契约。后面所有异步和事务处理都建立在这份契约之上前面多花十分钟把字段定好后面调试能省半天。4. 异步与事务监听两个改变行为的进阶开关4.1 EnableAsync 与 Async让监听器不阻塞主流程同步监听是默认行为发布方 publishEvent 会一直阻塞到监听器执行完。如果监听器里有几秒的耗时操作用户请求就会被拖住。要想让监听器另起线程执行第一步是在启动类或配置类上加 EnableAsyncSpringBootApplication EnableAsync public class EventDemoApplication { public static void main(String[] args) { SpringApplication.run(EventDemoApplication.class, args); } }第二步是在监听器方法上标注 AsyncComponent public class NotifyListener { Async EventListener public void onOrderCreated(OrderCreatedEvent event) { System.out.println(异步发送通知当前线程 Thread.currentThread().getName()); } }这之后监听器里的逻辑会交给 Spring 的异步线程池执行发布方 publishEvent 立即返回不再等待。注意 Async 对监听器 Bean 提出了要求方法所在的类是 Spring Bean且调用要经过代理。如果在一个类里直接 this 调用自己的 Async 方法代理不会介入异步自然不生效。我遇到好几次这种问题在线程名里发现异步监听还在主线程打印一查就是内部调用。4.2 定制 ApplicationEventMulticaster 的线程池EnableAsync 默认的异步执行器是 SimpleAsyncTaskExecutor每次调用都会新建线程不适合并发量高的场景。如果你想统一控制事件监听器的线程池常见做法是自定义一个 ApplicationEventMulticaster BeanConfiguration public class AsyncEventConfig { Bean public ApplicationEventMulticaster applicationEventMulticaster() { SimpleApplicationEventMulticaster multicaster new SimpleApplicationEventMulticaster(); ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor(); executor.setCorePoolSize(4); executor.setMaxPoolSize(8); executor.setQueueCapacity(100); executor.setThreadNamePrefix(event-exec-); executor.initialize(); multicaster.setTaskExecutor(executor); return multicaster; } }这段配置的作用是往容器里放一个自定义的 ApplicationEventMulticaster并给它配上线程池作为 taskExecutor。有了这个 executor所有监听器在调用时都会被丢进线程池执行整个系统的监听行为就全局异步化了。我配置了核心线程数 4、最大 8、队列 100你可以按监听器的实际耗时而调整参数。注意这种全局方式会让所有监听器都异步执行包括 TransactionalEventListener。事务监听器仍然在事务提交后触发但执行线程变成了线程池。全局改法影响面大项目早期不建议用先把 Async 用熟再考虑统一线程池。4.3 TransactionalEventListener在事务提交后再干真正的事普通 EventListener 的触发时机是 publishEvent 被调用的那个瞬间。如果外面有事务监听器会在事务还没提交时就执行了。举个实际的翻车例子某订单系统在事务方法里发布订单创建事件监听器收到后立刻调用下游库存系统结果主事务随后回滚了消息已经发出去、库存被扣了但订单没入库。这种业务不一致很难排查。TransactionalEventListener 把监听器执行时机绑定在事务生命周期上Component public class StockListener { TransactionalEventListener(phase TransactionPhase.AFTER_COMMIT) public void onOrderCreated(OrderCreatedEvent event) { System.out.println(订单事务已提交开始扣减库存orderId event.getOrderId()); } }AFTER_COMMIT 的含义是监听器只有在事务成功提交之后才执行。这样保证你对外部系统的副作用是在业务数据真正落库之后发生的事务如果回滚监听器不会被调用。使用 TransactionalEventListener 有个前提需要特别注意事件必须在事务边界内发布也就是发布方法要有 Transactional 或者正处于事务上下文中。如果没有活动事务默认情况下监听器不会被调用。如果你希望没有事务时也照常执行可以给注解加上 fallbackExecution trueTransactionalEventListener(phase TransactionPhase.AFTER_COMMIT, fallbackExecution true) public void onOrderCreated(OrderCreatedEvent event) { // 有事务走提交后执行无事务立即执行 }这个开关要慎用。我一开始以为加了 fallback 就万事大吉后来发现无事务场景下事件处理顺序和事务场景不一致监听逻辑如果依赖事务状态很容易判断出错。只有监听逻辑完全不依赖事务状态时才改这个值。4.4 TransactionPhase 四种取值怎么选TransactionalEventListener 的 phase 参数有四个选项整理成对比表更好记phase 取值触发时机典型用途BEFORE_COMMIT事务提交之前事务内校验、提交前的数据准备AFTER_COMMIT事务提交之后发消息、扣库存、清缓存最常用AFTER_ROLLBACK事务回滚之后补偿事务、失败告警AFTER_COMPLETION事务结束提交或回滚清理本地资源不区分成败AFTER_COMMIT 是最常用的选项适用于业务成功后的副作用。AFTER_ROLLBACK 适合补偿回滚比如通知其他服务不要再发货了。BEFORE_COMMIT 还在事务内监听方法里如果抛异常会回滚主事务平时少用。AFTER_COMPLETION 要在事件里自己判断事务最终状态比较绕不推荐。用事务监听器还有一个字段访问问题值得提醒AFTER_COMMIT 阶段事务已关闭别再尝试访问实体里的懒加载属性否则必然报 LazyInitializationException。这也是我在前面反复强调事件里只放 ID 的原因——把数据查询放到监听器内部自己执行工程上最稳。5. 避坑与排查Spring Event 使用中的五个高频问题5.1 监听器没触发先查事件类型和包扫描现象publishEvent 已经调用了控制台里看不到监听器的任何打印。原因最常见的是事件类型匹配问题。Spring 分发时拿实际事件对象和监听器参数类型做 instanceof 判断监听器参数是父类时子类事件会被接住监听器参数是子类时父类事件不会被匹配。也就是说事件继承关系会影响分发结果很多人在这上面被绕晕。另一个常见原因是监听器类没被 Spring 扫描到包路径不在 SpringBootApplication 扫描范围内。解决先确认监听器是 Spring Bean启动日志里应有它的注册信息再打印发布事件的实际类型用 event.getClass() 看类型层级。我一般会在发布前后各加一条日志先落一条“准备发布”紧接着打印事件 class类型匹配问题一查便知。5.2 Async 失效线程名一打全乱现象监听方法加了 Async但打印出来的线程名还是 http-nio 或主线程。原因要么缺少 EnableAsyncSpring 根本没有启用异步要么是 this 自调用导致代理没有生效还有一种情况是监听器类被多例处理或者 AOP 代理没有正确装配。解决先检查配置类上有没有 EnableAsync再看监听器方法是不是通过代理调用不要在同一个类里用 this 调自己的 Async 方法。如果还不行把线程名打印放到监听器方法第一行看实际线程是什么这一招能直接定位问题出在哪一层。5.3 事务监听器没执行先问事务存不存在现象TransactionalEventListener(AFTER_COMMIT) 监听器从头到尾没有执行。原因事件不是在事务边界内发布的。Spring 的事务事件监听器会检查当前是否有活动事务没有事务时直接跳过fallbackExecution 默认为 false。另一个因素是启用了全局异步 multicaster线程池上下文里没有事务传播状态。解决确认发布方法上有 Transactional或者事件是在已有事务的 Service 方法里发布的。如果业务确实存在无事务场景评估后加上 fallbackExecution true。排查时先在监听器入口加日志看它是不是在 AFTER_ROLLBACK 路径下执行了避免对触发时机产生误判。5.4 监听器抛异常会拖垮发布者事务现象监听器里出现 NullPointerException发布方法的事务竟然也回滚了日志里整个业务失败。原因同步监听器的异常会直接传播到发布方。如果发布方法包着 Transactional异常会触发事务回滚。这点容易踩坑因为事件机制把这些“附加处理”的失败和核心业务绑在了一起。解决在监听器里对非关键业务做 try-catch 捕获不要让异常继续往上抛。只有你确实希望“监听失败能阻断主流程”时才保留异常传播。我习惯把监听器内部逻辑包一层 try-catchcatch 后记录 error 日志并调用兜底逻辑这样主流程不会被外部副作用拖垮。5.5 同类型监听器的执行顺序不确定现象两个监听同一事件的 Bean 总是先 A 后 B但改了一行配置后执行顺序就变了业务结果也跟着不稳定。原因Spring 对同一事件的多个监听器默认按内部机制调度但它不是一份稳定的语义保证。依赖监听顺序做业务本质是让监听器之间产生了隐式耦合。解决如果确实需要顺序给监听方法加 Order 注解数字从小到大执行。如果监听器之间有严格的先后依赖建议拆成两个阶段事件或者让后一个监听器通过查询数据库判断“前一步是否完成”。凡是和顺序相关的事能避免就避免因为顺序这种东西在演进过程中迟早会被某个新监听器打乱。6. 用单元测试和日志把事件机制跑稳验证与排错实战事件机制解耦了发布方和监听方好处是灵活坏处是出了问题往往两头查不到线索所以单元测试和日志设计要提前做好。一个简单的测试可以这样写SpringBootTest class OrderServiceTest { Autowired private OrderService orderService; SpyBean private OrderEventListener listener; Test void createOrder_shouldTriggerListener() { orderService.createOrder(1001L, 2002L); Mockito.verify(listener, Mockito.times(1)) .onOrderCreated(Mockito.any(OrderCreatedEvent.class)); } }这里把真实的监听器包装成 spy调用 createOrder 后 verify 监听方法是否被调用参数和次数都能校验。测试前提是监听器是普通 Spring Bean没有被 final 之类的限制。异步监听器的测试会麻烦些。Async 监听器在执行完当前方法后立即返回但监听器方法可能在另一个线程里还没跑完直接 verify 大概率失败。常见做法是测试等一小段时间再断言或者给测试环境换成同步的广播器。我一般用 TestConfiguration 覆盖掉默认的广播器TestConfiguration public class SyncEventConfig { Bean public ApplicationEventMulticaster applicationEventMulticaster() { return new SimpleApplicationEventMulticaster(); } }没有设置 taskExecutor 的 SimpleApplicationEventMulticaster 就是同步执行的在测试里把异步配置替换掉断言就稳定了。除了单元测试线上排错的命根子是日志。我会在每个监听器入口加一行结构化日志事件类型 业务ID比如“handle OrderCreatedEvent orderId1001”。发布方发布前也打一行“publish OrderCreatedEvent orderId1001”。这样查日志时能完整还原一条事件链路的执行过程哪个环节没走到位一眼可见。我记得有一次线上事件没触发日志里发布方有输出监听器却完全没有痕迹最后排查发现是事件类型从父类换成了子类实例监听器参数还是父类分发逻辑没接住。那次浪费了两个小时全是入口日志没打全的锅。从那以后我每次写监听器都会先补上入口日志跑这份 spring event 示例时也习惯先看日志输出是否符合预期再往深处调试。希望这些经验能帮你把 Spring Event 用好少几个深夜排查的夜晚。本文还有配套的精品资源点击获取
RELATED

相关推荐

固定翼无人机目标检测YOLO数据集训练全流程踩坑记录

固定翼无人机目标检测YOLO数据集训练全流程踩坑记录

简介:这是一份面向目标检测学习与开发者的固定翼无人机检测数据集,适用于需要快速搭建无人机视觉识别任务的项目,可直接用于yolov5、yolov7、yolov8等主流算法的训练与验证。数据集中包含数百张真实场景下的无人机图像,标签统一为…

📅 2026/10/18 19:29:24
BrowserSkill:基于Chrome DevTools Protocol的轻量级浏览器CLI自动化工具

BrowserSkill:基于Chrome DevTools Protocol的轻量级浏览器CLI自动化工具

1. 项目概述:BrowserSkill不是插件,而是一套浏览器自动化能力的CLI封装体系BrowserSkill这个词最近在开发者社区里频繁出现,但它既不是Chrome商店里某个新上架的视频下载插件,也不是Edge浏览器内置的Copilot功能升级包。我第一次在…

📅 2026/10/18 19:24:23
新能源汽车数据集源码解析:从标注转换到训练落地全攻略

新能源汽车数据集源码解析:从标注转换到训练落地全攻略

简介:面向人工智能与新能源交叉领域研究者的数据索引型源码包,围绕新能源汽车健康度、充电站运营、充电桩布设、充电需求时空、电池异常检测、公交驾驶、车牌识别等八个细分方向,整理并说明了各数据集的数据背景、应用领域、目录结构及用途&a…

📅 2026/10/18 19:24:23
MORE NEWS

更多资讯

📰

Claude Code实战:终端里的AI逻辑引擎

很长一段时间,我写代码都离不开两样东西:编辑器里的光标,和大脑里的逻辑。直到我把 Claude Code 拉进终端,才发现原来“逻辑”这件事,也可以交给命令行去跑。Claude Code 是 Anthropic 推出的命令行 AI 编程代理&#…

📰

Access 2007数据库部署与运维全攻略:兼容旧格式、静默安装与数据安全

简介:Access 2007 免费版精简安装包,面向需要单独使用数据库办公场景的用户,适合办公文员、数据库初学者及需要轻量化部署 Access 环境的开发者。该版本基于 Office 2007 SP3 提炼封装,将核心程序升级至 SP3,解决了常见…

📰

LSTM时序预测实战:工业场景下的数据预处理与模型调优

简介:本资源是一套面向深度学习初学者与时间序列预测实践者的LSTM模型完整实现与优化方案,聚焦解决非平稳、多源异构时间序列的高精度建模与多步预测问题。资源包含350个文件,以82个Jupyter Notebook(.ipynb)为核心&am…

📰

Claude Code知识工作插件实战:从安装配置到自定义Slash Command扩展

1. 从"knowledge-work-plugins"这个名字说起:它到底在解决什么问题第一次看到knowledge-work-plugins这个仓库名,我的直觉是:这大概率不是一个"框架",而是一套面向知识工作者的能力扩展集合。事实也确实如此。…

📰

Livox mid360仿真配置指南:从点云数据到SLAM调试全解析

简介:这份资源面向需要搭建Livox-mid360激光雷达仿真环境的无人机视觉开发者,尤其适合使用PX4、XTDrone与Faster-lio开展毕设或科研实验的学生和工程师,可帮助快速打通从环境准备、模型修改到雷达驱动安装、SLAM建图验证的完整链路。包内共有…

📰

大模型推理优化实战:KV Cache与连续批处理在虚拟培训中的部署

1. 虚拟培训场景下,大模型推理到底难在哪先说结论:AI虚拟培训里的大模型推理,和你平时做的聊天机器人推理,完全不是一回事。我做过的模拟项目X,是一个面向企业内部新员工培训的AI虚拟导师系统。表面上看,它…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬