手写Spring之实现SpringBoot启动


一、项目结构

本项目使用gradle进行构建,其中mini-spring为根模块,包含两个子模块:framework模块和test模块

framework模块

framework模块为mini-spring项目的框架核心,用于实现spring的核心功能,可类比于开发中需要引入的jar包,为我们的test模块提供支撑。

我们使用包代替spring中的各种jar结构,其包结构为:

    beans:负责spring的bean的维护

    context:提供spring根据不同场景提出来的框架接口

    core:spring框架里经常用到的工具包

    starter:实现类似SpringBoot的启动方式

    web:实现web相关的功能

test模块

test模块是我们的应用模块,为我们的mini-spring框架提供测试,以验证framework内容的正确性、并反馈框架中存在的问题。

这是我们的最终的包结构

640.png

二、步骤

有了上一小节对结构的叙述,我们接下来来对我们的mini-spring框架进行具体实现

    首先创建gradle项目,命名为mini-spring

    并新建两个子模块 framework、test。

mini-spring的build.gradle

640.png

framework的build.gradle内容

640.png

test模块的build.gradle

此处我们了配置打包方式为jar的打包方式,以便于我们直接使用jar包的方式运行程序。

并且将项目的启动类Main-Class配置为com.qcby.Application。

640.png

下面是我们对启动器的具体实现:

framework模块:

在framework模块下的starter包中新建一个类,命名为MiniApplication

640.png

我们在这里打印一句 Hello mini-spring application! 以验证程序是否正确启动。(之后我们的还要对程序进行一步步的完善)

test模块

我们在test模块的跟目录下仿照springboot的启动方式,新建一个Application启动器,用于程序的启动。通过static调用的方式传入我们的类信息,并调用MiniApplication的run方法启动程序。

640.png

三、build验证

上面就是我们的启动器的全部代码了,是不是很简单?

我们在test模块的gradle配置中已经设置了main启动类,并且设置了项目的打包方式,接下来只要简单的build一下就可以完成打包。

640.png

选择我们的mini-spring根模块进行构建,可以看到在每个模块的目录下各自新生成了一个build文件夹,其中包含了一个libs目录,在libs目录中存放的就是我们最终生成的jar包了。

接下来进入我们的terminal(可以在idea下的terminal进到相应的目录,或者windows的控制台,或者mac的terminal,不过多叙述)

像springboot一样,我们输入命令:java -jar test/build/libs/test-1.0-SNAPSHOT.jar

就可以看到我们的MiniApplication成功启动了,并且在控制台输出了 Hello mini-spring application! 的内容。打印出mini-spring application代表着我们的framework内容被成功地调用了,如下图所示,

640.png

至此,我们mini-spring框架的启动器就完成了!

四、小结

本篇文章在于对框架的包结构以及各个包需要实现的各个功能进行叙述,并对框架的starter启动器进行了实现。项目使用gradle进行项目构建,首先新建了framework和test两个模块,framework负责实现spring的核心功能,并且使用包名对各个功能进行了划分;test模块则负责对framework模块代码的正确性进行验证。

在完成了项目目录结构的分析和创建后,我们对框架的starter启动器进行了实现,Application通过调用MiniApplication的入口run方法启动整个程序,并在程序启动成功后输出相应的结果。

项目中framework模块为test模块提供了支撑,test模块则反过来为framework模块提供验证。

我们后续将继续逐步对mini-spring框架进行完善,并完成相应功能的开发。在下一篇文章中,类似于springboot,我们将将把tomcat容器集成进我们的mini-spring框架之中,并对spring的DispatcherServlet进行具体的实现。

品略图书馆 http://www.pinlue.com/