前言 经过前面对 Spring AOP 、事务的总结,我们已经对它们有了一个比较感性的认知了。 今天,我继续安利一个独门绝技: Spring 事务的钩子函数。 单纯的讲技术可能比较枯燥乏味。接下来,我将以一个实际的案例来描述Spring事务钩子函数的正确使用姿势。 一、案例背景…
Awesome-LLM-Strawberry 是一个精心整理的资源集合,它汇集了关于LLM 的论文、博客和项目。该项目特别关注 OpenAI o1 以及推理技术。 无论你是研究者、 开发者还是对目前最强大模型 OpenAI o1 充满好奇的普通爱好者,这里都有你需要的资源。 Awesome-LLM-Strawberry 已经在 GitHub…
weread2notion-pro 是一个自动化工具, 它能够帮助用户将微信读书中的笔记和书籍信息同步到 Notion。 通过这个项目,你可以轻松地将阅读过程中的思考和笔记整理到一个更加系统化的知识管理平台。 开源地址:https://github.com/malinkang/weread2notion-pro 核心内容 ① 自动化同步:项目通过…
前言 前文中讲到了 Connector 的初始化与启动,其中最关键的就是 ProtocolHandler 的初始化与启动。tomcat 中 ProtocolHandler 的默认实现类是 Http11NioProtocol。tomcat9.0.16 中 ProtocolHandler 的实现类中还有一个…
前言 前文讲到了 ProtocolHandler 及其默认实现类 Http11NioProtocol,在 Http11NioProtocol 的构造方法中创建了一个 NioEndpoint 对象,并且在 Http11NioProtocol 的 init 和 start 方法中最重要的步骤是调用这个 NioEndpoint 对象的 init 和 start…
前言 前文介绍了 NioEndpoint,其中讲到了在 NioEndpoint#startInternal 方法里创建并启动了 Acceptor 和 Poller,线程。本篇文章先看 Acceptor,下篇文章再看 Poller。 1. Acceptor Acceptor 的构造方法声明为: private final…
前言 前文里讲到了 NioEndpint 的启动过程中创建了多个 Poller 对象,并启动了 Poller 线程。在 上篇文章 中介绍了 Acceptor 的 run 方法,其中讲到了 Acceptor 的工作就是接受客户端的连接并转交给 Poller 线程处理,本文将分析 Poller 和 PollerEvent。Poller 和…
前言 前文中分析了 Poller 和 PollerEvent,Poller#processSocket 方法里获取了一个 SocketProcessorBase 来处理SocketChannel 的读写事件,在 SocketProcessorBase 的子类 SocketProcessor#doRun 方法里通过…
前言 前文讲到了 Engine 的 init 和 start 方法,在 Engine 的 start(ContainerBase#startInternal) 方法里调用了子容器的 start 方法,而 Engine 的子容器就是 Host。在 Engine 的 init 方法中并没有调用子容器的 init 方法,而是在 start 方法中调用子容器的…
前言 前文简单介绍了 Host,讲到了Context的启动时机,就是在 Engine 的 start 方法中调用了子容器的 start 方法(在ContainerBase#startInternal),子容器又调用子容器的方法,以此类推,所有子容器的start 方法都会被调用。 1. StandardContext#initInternal…