Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
为什么我创建了一个轻量级迷你弹簧替代品以及我是如何做到的_创想鸟

为什么我创建了一个轻量级迷你弹簧替代品以及我是如何做到的

在这篇小文章中,我将尝试解释为什么我创建这个库?以及它是如何实施的?

我为什么创建这个库?

我在许多项目中使用了 Java EE 框架,其中大多数项目运行应用程序的可用资源没有限制,但在极少数情况下,我们的资源有限,尤其是在部署服务上部署应用程序的内存,因此当应用程序超过限制时,部署服务将首先减慢应用程序的速度,然后如果继续运行,服务将关闭它。我们使用传统的 Spring 框架,甚至没有 Spring Boot,我们尝试使用不同的库,但差异很小且毫无价值,这就是创建一个轻量级 Spring 替代方案,专注于尽可能减少内存消耗的想法的开始。 .

当我开始设计这个库时,我脑子里只有两个目标:
1 – 尽可能减少内存消耗
2 – 从学习的角度以及过渡本身的复杂性来看,尝试尽可能多地使用现有的 Java EE API,以使向库的过渡变得容易。
凭借这两个目标,我成功地将其中一个应用程序的内存占用量减少了 40% 左右,并使过渡变得轻松快速,因为它与现有解决方案类似。

我是如何创建这个库的?

这里是 GitHub 存储库,您可以在阅读时检查代码。

整个库有很多部分(截图如下),大部分实现在主模块中,主模块也分为三种独立模块:Core、JPA、Web。 App 模块主要用于集成,Plugin 模块是一个 Maven 插件,可帮助在包存档内创建必要的文件,以使库正常工作

为什么我创建了一个轻量级迷你弹簧替代品以及我是如何做到的

核心模块

所以我们将从核心模块开始,顾名思义,它包含库的核心功能,即依赖注入或控制反转。
为了实现这种功能,首先它首先在编译阶段扫描应用程序的类路径,以查找库应管理的所有带注释的类,以便为带注释的类创建组件定义。

为什么我创建了一个轻量级迷你弹簧替代品以及我是如何做到的

为什么我创建了一个轻量级迷你弹簧替代品以及我是如何做到的

组件定义基本上包含了我们稍后从此类实例化对象所需的所有信息,例如构造函数信息,如果有一些带有注入注释的setter(仅支持构造函数和setter注入)如果该类有一些接口或扩展其他类,我们将拥有从此类创建对象所需的所有信息(下面的屏幕截图)。
然后,在扫描所有类路径注释并创建所需的所有组件定义后,我们将它们作为 JSON 文件存储在类路径中。

为什么我创建了一个轻量级迷你弹簧替代品以及我是如何做到的

核心模块的第二个也是主要功能是基于工厂设计模式的依赖注入和控制反转,因此我们有ApplicationContext接口,它自身扩展了ComponentFactory接口,该接口的主要方法是getComponent 方法,将从组件名称返回对象。

为什么我创建了一个轻量级迷你弹簧替代品以及我是如何做到的

正如您首先在上面的屏幕截图中看到的,我们尝试检查该组件是否存在于已初始化的 Singleton 组件中,如果不存在,那么我们首先从 JSON 文件中获取组件定义,然后启动 while 循环来获取所有组件在将组件定义及其依赖项传递给组件组装器以获取准备注入的完整对象之前,先确定组件的依赖项。

为什么我创建了一个轻量级迷你弹簧替代品以及我是如何做到的

JPA模块

JPA 模块的实现与 spring data JPA 非常相似,但非常少,之所以非常相似,是因为我在很多项目中使用了 spring data,并且我发现它很容易使用,正如我之前所说,我希望过渡到库平滑并且需要尽可能少的工作,因此实现我自己的迷你 Spring 数据版本是最好的选择。

实现围绕 JpaRepository 接口,其中包含最常见的数据库操作,如保存、删除和 findAll…,为了使用 JPA 模块,您需要扩展此接口并提供此接口应管理的实体及其 id ,然后在扩展接口并使用 Repository 注解进行注解后,您可以定义方法并使用 Query 注解对其进行注解并提供 JPQL 查询,然后库在编译阶段将创建一个实现该接口的功能齐全的类。

为什么我创建了一个轻量级迷你弹簧替代品以及我是如何做到的

为什么我创建了一个轻量级迷你弹簧替代品以及我是如何做到的

为什么我创建了一个轻量级迷你弹簧替代品以及我是如何做到的

该库还将管理应用程序的事务部分,因此从事务的角度来看,所有存储库接口和任何带有事务注释的类都将由库管理。因此,对于任何事务组件,该库将创建代理来管理基于 Transactional 注释的事务,并且还将管理实体管理器生命周期。

为什么我创建了一个轻量级迷你弹簧替代品以及我是如何做到的

为什么我创建了一个轻量级迷你弹簧替代品以及我是如何做到的

网页模块

Web 模型负责管理应用程序的所有 Web 部分,根据设计,它是一个独立的模块,这意味着它可以独立于库中的其余模块使用,通常它的用法与一些熟悉的 Java 非常相似EE 库,例如 Spring web 或 Jax-rs。

PPT.CN,PPTCN,PPT.CN是什么,PPT.CN官网,PPT.CN如何使用 PPT.CN,PPTCN,PPT.CN是什么,PPT.CN官网,PPT.CN如何使用

一键操作,智能生成专业级PPT

PPT.CN,PPTCN,PPT.CN是什么,PPT.CN官网,PPT.CN如何使用 37 查看详情 PPT.CN,PPTCN,PPT.CN是什么,PPT.CN官网,PPT.CN如何使用

实现是基于注释的,你有用Controller注释注释的类,在这个控制器中你会找到用PathMapping注释的方法,这些方法将根据一些标准(例如类型的类型)处理特定路径或特定请求请求,内容类型…

为什么我创建了一个轻量级迷你弹簧替代品以及我是如何做到的

为什么我创建了一个轻量级迷你弹簧替代品以及我是如何做到的

从外面看,它与其他库非常相似,但从内部看,它是不同的,因为该库将在运行时更改这些Controller类,使它们全部扩展BaseHttpServlet,这也扩展了HttpServlet 并且它们将作为常规 servlet 工作。

为什么我创建了一个轻量级迷你弹簧替代品以及我是如何做到的

如上面的截图所示,首先我们在init方法中初始化组件,使用WebApplicationContext注入所有依赖项,然后我们将使用handleRequest方法处理传入此Controller的所有请求,通过这种方法,我们将使用现有的 servlet api 来管理控制器,这将有助于保持较低的内存占用量,并减少开销,因为该库充当补充 servlet API 工作的插件。

首先,我们尝试将请求映射到正确的方法,然后,我们尝试通过从上下文或 HttpServletRequest 获取信息(例如请求参数或标头或路径变量)来将所有请求的信息注入方法内或请求的正文…

为什么我创建了一个轻量级迷你弹簧替代品以及我是如何做到的

为什么我创建了一个轻量级迷你弹簧替代品以及我是如何做到的

我们转换所有这些信息,然后在请求时将它们作为参数注入到方法中,然后我们执行该方法并根据 PathMapping 生成或内容类型(默认情况下为 application/Json)转换结果或结果然后我们将内容写入HttpServletResponse.

最后,如果流程中出现问题并抛出错误,我们会捕获此错误或异常,并尝试根据异常的类型进行处理,我们有异常处理程序来处理不同类型的异常,用户可以还提供更多处理程序来按照他想要的方式处理任何异常。

为什么我创建了一个轻量级迷你弹簧替代品以及我是如何做到的

为什么我创建了一个轻量级迷你弹簧替代品以及我是如何做到的

Maven插件

最后也是重要的部分是 Maven 插件,它将创建应用程序正常工作以及构建 jar 或 war 包所需的所有文件。
首先插件将扫描类路径和依赖项以搜索 component-definitions-json 文件,从该文件中它将生成:
lazy-application.json:包含应用程序的所有组件及其依赖项

lazy-application.properties:包含控制器和实体的列表,因此我们不需要在运行时扫描类路径。
最后,如果包装是罐子,我们将得到主类。

为什么我创建了一个轻量级迷你弹簧替代品以及我是如何做到的

为什么我创建了一个轻量级迷你弹簧替代品以及我是如何做到的

最后我们构建包存档文件,其中包含应用程序代码及其依赖项以及我们在上一步中生成的文件。

为什么我创建了一个轻量级迷你弹簧替代品以及我是如何做到的

为什么我创建了一个轻量级迷你弹簧替代品以及我是如何做到的

我尽量不深入细节,以使文章简短且不那么复杂理解,当然代码可以在 GitHub 上找到,这样你也可以使用它。如果你有问题,请将其放在下面,我会尽力回答他们.

以上就是为什么我创建了一个轻量级迷你弹簧替代品以及我是如何做到的的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/496884.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
workerman介绍(附使用方法)
上一篇 2025年11月8日 18:25:44
PHP网站文件有哪些
下一篇 2025年11月8日 18:25:48

相关推荐

  • VSCode安装C/C++文档查看 提升开发效率的VSCode技巧

    答案是利用C/C++扩展和cppreference插件实现高效文档查阅。首先安装微软官方C/C++扩展,启用智能感知与悬停提示;再安装cppreference扩展,通过命令面板直接搜索标准库函数,实现离线在线无缝查阅;结合Doxygen生成项目文档,使用“转到定义”功能快速跳转源码;同时借助Inte…

    2026年9月22日
    000
  • Sublime开发MySQL备份与恢复脚本方案_实现定时导出与自动导入机制

    Sublime开发MySQL备份与恢复脚本方案_实现定时导出与自动导入机制Sublime开发MySQL备份与恢复脚本方案_实现定时导出与自动导入机制Sublime开发MySQL备份与恢复脚本方案_实现定时导出与自动导入机制Sublime开发MySQL备份与恢复脚本方案_实现定时导出与自动导入机制

    使用sublime编写mysql备份与恢复脚本能提升数据安全性与操作效率;1.通过shell或python调用mysqldump实现自动备份,建议加入时间戳、压缩存储及权限设置;2.结合cron配置定时任务实现自动化,注意使用绝对路径并添加日志记录;3.编写恢复脚本导入sql文件,需确保数据库结构一…

    2026年9月22日 用户投稿
    000
  • VSCode搭建Vivado开发环境(详细配置指南,FPGA开发必备)

    答案:通过安装Verilog/SystemVerilog和Tcl扩展、配置Linter进行语法检查,并在tasks.json中定义调用Vivado命令行的任务,可在VSCode中实现RTL开发、语法高亮、智能提示及综合仿真等自动化流程,提升FPGA开发效率。 将VSCode作为Vivado的开发前端…

    2026年9月22日
    000
  • UC浏览器占用内存太高怎么办_UC浏览器内存占用高优化方案

    UC浏览器内存占用过高可通过清理缓存、关闭多余标签页、禁用插件和开启省电模式解决。首先清除浏览数据释放资源,其次减少同时开启的标签页数量以降低内存压力,接着管理扩展程序避免后台消耗,最后启用性能优化功能减少资源使用,提升整体运行效率。 如果您在使用UC浏览器时发现设备运行缓慢或应用响应迟缓,这很可能…

    2026年9月22日
    100
  • VSCode高效配置Node.js:npm集成、中文报错、断点调试

    答案:高效配置VSCode与Node.js需确保Node.js和npm为最新版,利用集成终端运行命令,通过jsconfig.json或tsconfig.json优化项目配置,解决中文乱码需设置终端编码为UTF-8并选择支持中文的字体,调试核心是正确配置launch.json文件,使用pwa-node…

    2026年9月22日
    400
  • itextpdf freemarker渲染

    关于打印pdf操作的需求,经过研究,发现以下两种方法: 在现有的模板上进行编辑,这种方法操作难度较大。而通过FreeMarker生成静态页面,然后转换为HTML,操作更为顺畅。动态生成PDF的方法在网上参考较多,经过对比,我认为使用FreeMarker结合IText生成PDF最为简单。参考链接为ht…

    2026年9月22日
    400
  • VSCode精简配置Git:中文提交记录、分支可视化、冲突解决

    首先解决中文乱码需配置Git和VSCode编码为UTF-8,其次通过GitLens或Git Graph实现分支可视化,最后利用VSCode内置的冲突解决工具高效处理合并冲突,全面提升Git使用体验。 在VSCode里用Git,我总觉得能再顺手点。特别是处理中文提交信息、想直观看看分支图,或者面对恼人…

    2026年9月22日
    500
  • MySQL数据类型详解_如何选择合适字段类型提升存储效率

    MySQL数据类型详解_如何选择合适字段类型提升存储效率MySQL数据类型详解_如何选择合适字段类型提升存储效率MySQL数据类型详解_如何选择合适字段类型提升存储效率MySQL数据类型详解_如何选择合适字段类型提升存储效率

    mysql选择合适数据类型的核心原则是根据数据特性选择占用空间最小且能准确表达数据的类型。1. 选择整数类型时,应依据数据范围选择tinyint、smallint、mediumint、int或bigint,优先选更小类型以节省空间;2. 字符串类型中,char适用于固定长度数据,varchar适用于…

    2026年9月22日 用户投稿
    000
  • VSCode调试FPGA工程的技巧(结合Vivado,快速定位问题)

    vscode在fpga开发中并非替代vivado,而是作为高效辅助工具提升开发效率。1. 在代码编写方面,vscode提供 superior 的语法高亮、自动补全和代码管理功能,显著优化verilog、systemverilog和tcl脚本的编写体验,并通过git实现无缝版本控制;2. 在仿真与自动…

    2026年9月22日
    1200
  • VSCode安装Go语言插件(图文详解,新手避坑指南)

    首先安装Go SDK并配置环境变量,再安装VSCode及Go插件,关键步骤是通过Go: Install/Update Tools命令安装gopls、dlv等核心工具链,确保代码补全、调试等功能正常;若遇问题,需检查Go版本、GOPROXY代理、权限及网络,结合输出面板错误信息定位解决。 配置VSCo…

    2026年9月22日
    400
  • 笔记—Linux安装OpenCV及VSCode的配置编译

    笔记—Linux安装OpenCV及VSCode的配置编译笔记—Linux安装OpenCV及VSCode的配置编译笔记—Linux安装OpenCV及VSCode的配置编译笔记—Linux安装OpenCV及VSCode的配置编译

    在学习新技能的过程中,我选择了在linux系统上进行操作,这对于从未接触过linux的人来说是一个绝佳的学习机会。这篇文章记录了我在linux上安装opencv的过程。 我选择的Linux发行版是Ubuntu 20.04.3,并将其安装在Virtual Box虚拟机中。Ubuntu的相关资料丰富,选…

    2026年9月22日 用户投稿
    200
  • 使用Sublime管理MySQL数据库结构_高效编辑表结构与字段定义脚本

    使用Sublime管理MySQL数据库结构_高效编辑表结构与字段定义脚本使用Sublime管理MySQL数据库结构_高效编辑表结构与字段定义脚本使用Sublime管理MySQL数据库结构_高效编辑表结构与字段定义脚本使用Sublime管理MySQL数据库结构_高效编辑表结构与字段定义脚本

    用 sublime text 管理 mysql 数据库结构脚本高效且灵活。1. 适合习惯文本编辑、需自定义流程的开发者;2. 启动快、资源占用低,支持多光标、正则替换,插件丰富,易配合 git;3. 建议每张表单独文件、按模块分目录、主脚本汇总建表语句,索引外键单独文件;4. 推荐插件有 sqlto…

    2026年9月22日 用户投稿
    000
  • VSCode搭建RISC-V开发环境(结合FPGA,嵌入式开发指南)

    首先安装RISC-V GCC工具链并配置环境变量,接着在VSCode中安装C/C++和RISC-V GDB扩展,然后配置launch.json实现调试,结合OpenOCD支持FPGA JTAG调试,使用Makefile管理编译,选择稳定工具链版本,通过命令行测试GDB连接排查问题,利用ILA和仿真工…

    2026年9月22日
    300
  • VSCode设置SSH远程开发(安全连接,跨平台开发指南)

    vscode的ssh远程开发功能通过ssh协议实现本地编辑器与远程服务器的安全连接,让用户能在本地直接操作远程代码,享受与本地一致的开发体验。首先需安装“remote – ssh”扩展并配置~/.ssh/config文件,定义host、hostname、user、port和identit…

    2026年9月22日
    000
  • 配置PHP多线程的性能监控_通过监控优化php多线程怎么实现的效率

    PHP虽不支持传统多线程,但可通过pthreads扩展在CLI模式下实现;合理设置线程数、使用线程池、集成性能监控工具并优化任务分配可显著提升执行效率。 PHP 本身并不支持传统意义上的多线程,因为它默认运行在 Web 服务器(如 Apache 或 Nginx)的 CGI/FPM 模式下,每个请求是…

    2026年9月22日
    300
  • VSCode连接Modelsim仿真工具(调试技巧分享,波形分析指南)

    首先确保Modelsim路径加入系统PATH,安装VSCode的HDL扩展,配置tasks.json定义编译、仿真任务,并编写Tcl脚本自动化add wave、run等操作,通过问题匹配器解析错误,利用Tcl实现参数化仿真与自动化测试,结合Makefile或脚本提升大型项目管理效率。 将VSCode…

    2026年9月22日
    400
  • python 基准测试(cProfile kcachegrind line_profiler memory_profiler)

    learn from 《python高性能(第2版)》 类似工具:pycharm profile对函数调用效率进行测试 1. 例子 一个圆周运动的动画 代码语言:javascript代码运行次数:0运行复制 from matplotlib import pyplot as pltfrom matpl…

    2026年9月22日
    200
  • VSCode搭建前端开发环境(新手必备,插件配置详解)

    vscode是前端开发的理想选择,因其轻量、可扩展且拥有活跃的社区支持,能通过插件将基础编辑器打造成高效智能的开发环境。其优势在于启动快、资源占用低、内置git和调试工具,并拥有强大的插件生态,适配react、vue等各类前端技术栈。新手必装插件包括eslint与prettier(保障代码规范与格式…

    2026年9月22日
    100
  • 常见分布式任务调度工具浅析

    一、背景 在日常业务中,经常会遇到需要在特定时间执行任务或周期性执行任务的需求。这些任务通常被归类为定时任务。为了满足这种需求,各种任务调度框架应运而生,如Timer、ScheduledThreadPoolExecutor(没错,它也可以用于定时任务)、Quartz等。然而,随着分布式和微服务的发展…

    2026年9月22日
    200
  • VSCode安全更新机制解析

    VSCode通过自动检查、数字签名验证和用户可控策略确保更新安全。启动时后台定期HTTPS请求检查新版本,每日一次;安装包经平台特定签名(Windows Authenticode、macOS代码签名、Linux GPG)验证完整性;用户可选自动更新、提示或关闭,企业可集中管控;微软通过安全入口响应漏…

    2026年9月22日
    200

发表回复

登录后才能评论
关注微信