”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 为什么我创建了一个轻量级迷你弹簧替代品以及我是如何做到的

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

发布于2024-08-26
浏览:235

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

我为什么创建这个库?

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

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

我是如何创建这个库的?

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

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

Why i created a lightweight mini spring alternative and how I did it

核心模块

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

Why i created a lightweight mini spring alternative and how I did it

Why i created a lightweight mini spring alternative and how I did it

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

Why i created a lightweight mini spring alternative and how I did it

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

Why i created a lightweight mini spring alternative and how I did it

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

Why i created a lightweight mini spring alternative and how I did it

JPA模块

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

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

Why i created a lightweight mini spring alternative and how I did it

Why i created a lightweight mini spring alternative and how I did it

Why i created a lightweight mini spring alternative and how I did it

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

Why i created a lightweight mini spring alternative and how I did it

Why i created a lightweight mini spring alternative and how I did it

网页模块

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

实现基于注释,您有用 Controller 注释注释的类,在该控制器内您将找到用 PathMapping 注释的方法,这些方法将处理特定路径或特定基于某些标准的请求,例如请求类型、内容类型...

Why i created a lightweight mini spring alternative and how I did it

Why i created a lightweight mini spring alternative and how I did it

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

Why i created a lightweight mini spring alternative and how I did it

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

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

Why i created a lightweight mini spring alternative and how I did it

Why i created a lightweight mini spring alternative and how I did it

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

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

Why i created a lightweight mini spring alternative and how I did it

Why i created a lightweight mini spring alternative and how I did it

Maven插件

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

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

Why i created a lightweight mini spring alternative and how I did it

Why i created a lightweight mini spring alternative and how I did it

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

Why i created a lightweight mini spring alternative and how I did it

Why i created a lightweight mini spring alternative and how I did it

我尽量不深入细节,以使文章简短且不那么复杂,易于理解,当然,代码可以在 GitHub 上找到,因此您也可以使用它。如果您有疑问,请将其放在下面,我会尝试回答他们。

版本声明 本文转载于:https://dev.to/7oukiw7rairi/why-i-created-a-lightweight-mini-spring-alternative-and-how-i-did-it-1a93?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-04-12
  • 您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    在javascript console 中显示颜色是可以使用chrome的控制台显示彩色文本,例如红色的redors,for for for for错误消息?回答是的,可以使用CSS将颜色添加到Chrome和Firefox中的控制台显示的消息(版本31或更高版本)中。要实现这一目标,请使用以下模...
    编程 发布于2025-04-12
  • 如何使用PHP将斑点(图像)正确插入MySQL?
    如何使用PHP将斑点(图像)正确插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call ...
    编程 发布于2025-04-12
  • IE6兼容自定义数据属性指南
    IE6兼容自定义数据属性指南
    在IE 6中的自定义数据属性:分发神话 custom Data属性,HTML5的关键功能,使开发人员能够将非可视数据附加到HTML elements for HTML elements以供以后回顾。但是,一个常见的误解包围着它们与诸如Internet Explorer 6的传统浏览器的兼容性。 误...
    编程 发布于2025-04-12
  • 如何将多种用户类型(学生,老师和管理员)重定向到Firebase应用中的各自活动?
    如何将多种用户类型(学生,老师和管理员)重定向到Firebase应用中的各自活动?
    Red: How to Redirect Multiple User Types to Respective ActivitiesUnderstanding the ProblemIn a Firebase-based voting app with three distinct user type...
    编程 发布于2025-04-12
  • 如何同步迭代并从PHP中的两个等级阵列打印值?
    如何同步迭代并从PHP中的两个等级阵列打印值?
    同步的迭代和打印值来自相同大小的两个数组使用两个数组相等大小的selectbox时,一个包含country代码的数组,另一个包含乡村代码,另一个包含其相应名称的数组,可能会因不当提供了exply for for for the uncore for the forsion for for ytry...
    编程 发布于2025-04-12
  • 为什么尽管有效代码,为什么在PHP中捕获输入?
    为什么尽管有效代码,为什么在PHP中捕获输入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,输出...
    编程 发布于2025-04-12
  • 为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    Class 'ZipArchive' Not Found Error While Installing Archive_Zip on Linux ServerSymptom:When attempting to run a script that utilizes the ZipAr...
    编程 发布于2025-04-12
  • Pandas DataFrame转字典:列表值转换技巧
    Pandas DataFrame转字典:列表值转换技巧
    在许多数据操作任务中,将pandas dataframe转换为词典,将pandas dataframe从pandas dataframe提取到方便的格式是必要的。一种常见的需求是将数据框转换为python字典,其中第一列的元素变为键,同一行中其他列的元素变为值。我们要将此数据框架转换为以下形式的字...
    编程 发布于2025-04-12
  • Java是否允许多种返回类型:仔细研究通用方法?
    Java是否允许多种返回类型:仔细研究通用方法?
    在Java中的多个返回类型:一种误解类型:在Java编程中揭示,在Java编程中,Peculiar方法签名可能会出现,可能会出现,使开发人员陷入困境,使开发人员陷入困境。 getResult(string s); ,其中foo是自定义类。该方法声明似乎拥有两种返回类型:列表和E。但这确实是如此吗...
    编程 发布于2025-04-12
  • Entity Framework中如何高效查询复合键实体?
    Entity Framework中如何高效查询复合键实体?
    高效查询 Entity Framework 中具有复合主键的实体 在使用 Entity Framework 和复合主键时,实现与简单 Contains() 查询相同的功能变得更加复杂。本文探讨解决此问题的各种方法: 尝试对键值对使用 Contains 尝试使用表示复合主键值的元组进行直接连接或 Co...
    编程 发布于2025-04-12
  • 您如何在Laravel Blade模板中定义变量?
    您如何在Laravel Blade模板中定义变量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配变量对于存储以后使用的数据至关重要。在使用“ {{}}”分配变量的同时,它可能并不总是最优雅的解决方案。幸运的是,Blade通过@php Directive提供了更优雅的方法: $ old_section =“...
    编程 发布于2025-04-12
  • 如何有效地转换PHP中的时区?
    如何有效地转换PHP中的时区?
    在PHP 利用dateTime对象和functions DateTime对象及其相应的功能别名为时区转换提供方便的方法。例如: //定义用户的时区 date_default_timezone_set('欧洲/伦敦'); //创建DateTime对象 $ dateTime = ne...
    编程 发布于2025-04-12
  • 如何克服PHP的功能重新定义限制?
    如何克服PHP的功能重新定义限制?
    克服PHP的函数重新定义限制 但是,PHP工具腰带中有一个隐藏的宝石:runkit扩展。它使您能够灵活地重新定义函数。 runkit_function_renction_rename() runkit_function_redefine() //重新定义'this'以返回“新和改...
    编程 发布于2025-04-12
  • 如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解决方案: args)抛出异常{ 日历cal = calendar.getInstance(); SimpleDateFormat SDF =新的SimpleDateFormat(“...
    编程 发布于2025-04-12

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3