从头开始实现一个小型spring框架——手写Spring之实现SpringBoot启动

写在前面

最近学习了一下spring的相关内容,所以也就想要照猫画虎地记录和实现一下spring的框架,通过阅读这些也希望能够消除对Spring框架的恐惧,其实细心阅读框架也很容易理解。
mini-spring尽量实现spring的核心功能。文章写得很仓促,可能不是很全面,在全部完成之后我们再来完善表达吧,见谅~

项目的源码我放在了github上:源码地址

我会在这里整理文章的系列目录:

  1. 从头开始实现一个小型spring框架——手写Spring之实现SpringBoot启动
  2. 从头开始实现一个小型spring框架——手写Spring之集成Tomcat服务器
  3. 从头开始实现一个小型spring框架——控制器controller的实现
  4. 从头开始实现一个小型spring框架——实现Bean管理(IOC与DI)

一、Spring家族体系

关于spring家族体系的介绍,欢迎移步我的另一篇博客,这里有对Spring发展历史的一些介绍。
直达链接--------->>> 理解Spring家族生态体系

当然,你只需要知道Spring的核心机制,如IOC和AOP等内容,就可以开始阅读下面的内容了。

二、Gradle介绍

2.1 Gradle 产生背景

随着敏捷开发实践的崛起,人们从 XML 文件的构建方式,寻求一个可表达且可维护新的构建工具。Gradle就是满足这种需求的新的构建工具。

2.2 Gradle 优势

Gradle 是基于 JVM 构建工具的新一代版本,它融合了 Ant 跟 Maven 中的优点,并且将其优点发挥更加极致。
Gradle 使用了基于 Groovy 的 DSL,摈弃 XML,更加强大跟表达性强。开发者可以使用 Java,Groovy,Kotlin 等语言去编写构建逻辑。
Gradle提供了一套依赖管理方式,不仅高度可配置,而且能够 Maven,Ivy 相兼容。Gradle 的依赖管理不仅限于外部库,同时还支持多项目构建,项目之间依赖建模。
Gradle 还支持对 Ant 跟 Maven 的构建项目进行无缝迁移。

2.3 为什么使用Gradle?

因为之前很少使用gradle进行项目构建,也为了自己学习一下,所以就选择了gradle,并没有什么特殊情结~。如果你之前就已经很熟悉maven的项目构建和模块管理,那么你可以很快地无痛切换到gradle,而且使用gradle会让你的依赖看起来更加简洁。

三、项目结构

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

3.1 主模块

3.2 framework模块结构

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

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

  • beans:负责spring的bean的维护
  • context:提供spring根据不同场景提出来的框架接口
  • core:spring框架里经常用到的工具包
  • starter:实现类似SpringBoot的启动方式
  • web:实现web相关的功能

3.3 test模块结构

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

这是我们的最终的包结构

四、实现步骤

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

  1. 首先创建gradle项目,命名为mini-spring。并新建两个子模块 frameworktest

mini-spring的build.gradle

plugins {
    id 'java'
}

group 'com.qcby'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

subprojects {
    
}

framework的build.gradle内容

plugins {
    id 'java'
}

group 'com.qcby'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

test模块的build.gradle

此处我们了配置打包方式为jar的打包方式,以便于我们直接使用jar包的方式运行程序。
并且将项目的启动类Main-Class配置为com.qcby.Application。

plugins {
    id 'java'
}

group 'com.qcby'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile(project(':framework'))
}

jar{
    manifest {
        attributes "Main-Class":"com.qcby.Application"
    }
    from{
        configurations.compile.collect{
            it.isDirectory() ? it : zipTree(it)
        }
    }
}

下面是我们对启动器的具体实现:
framework模块:
在framework模块下的starter包中新建一个类,命名为MiniApplication

package com.qcby.starter;

/**
 * @author kevinlyz
 * @ClassName MiniApplication
 * @Description 框架的入口类
 * @Date 2019-06-04 19:21
 **/
public class MiniApplication {
    public static void run(Class<?> cls,String[] args){
        System.out.println("Hello mini-spring application!");
    }
}

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

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

package com.qcby;

import com.qcby.starter.MiniApplication;

/**
 * @author kevinlyz
 * @ClassName Application
 * @Description TODO
 * @Date 2019-06-04 19:02
 **/
public class Application {
    public static void main(String[] args) {
    	//测试打印
        System.out.println("Hello World!");
        //启动方法
        MiniApplication.run(Application.class,args);
    }
}

五、测试

上面就是我们的starter启动器的全部代码了,仅仅一个静态调用就可以实现了。hh,太短了是不是,很简单是不是?额,不过确实已经实现了。

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

选择我们的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内容被成功地调用了,如下图所示,
在这里插入图片描述

至此,我们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进行具体的实现。
如果你感觉这篇文章对你有所帮助,麻烦点个赞呀~~

下一篇直达链接:从头开始实现一个小型spring框架——手写Spring之集成Tomcat服务器

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: Spring Framework是一个开源的Java平台,它提供了一组全面的工具来支持Java应用程序开发。它主要包括IoC容器、AOP框架、事务管理、MVC框架、DAO框架、连接池等。它可以帮助程序员更好地组织代码,减少重复性工作,提高代码质量。手写Spring框架需要对Java编程和设计模式有较深的了解,并对Spring框架源码有着深入的研究。 ### 回答2: Spring框架一个开源的Java平台,用于构建企业级应用程序。它提供了一种全面的编程和配置模型,用于开发基于Java的应用程序和服务。手写Spring框架意味着从头开始实现Spring的核心功能。 手写Spring框架的基本步骤包括: 1. 创建一个核心容器类,用于管理应用程序中的Bean对象。这个容器类需要提供注册、获取和销毁Bean的功能。 2. 定义一个Bean注解,用于标识哪些类应该被容器所管理。 3. 创建一个Bean定义类,用于存储每个Bean的元数据信息,包括类名、作用域和依赖关系等。 4. 实现依赖注入功能,通过读取Bean定义中的依赖关系,将相关的Bean对象注入到目标Bean中。 5. 提供AOP(面向切面编程)功能,允许开发者在应用程序的特定点进行横切关注点的处理。 6. 实现声明式事务管理功能,使用注解或XML配置方式来处理数据库事务。 7. 提供对不同数据访问技术(如JDBC、ORM框架、NoSQL等)的支持,通过集成相应的库来简化数据访问代码。 8. 增加对Web开发的支持,如处理请求、渲染视图等。 手写Spring框架需要具备对Java语言的深入了解,熟悉反射、代理、设计模式等概念和技术。还需要对依赖注入、AOP、事务管理、Web开发等方面有一定的理解。实现一个完整的Spring框架一个庞大而复杂的任务,需要经过反复的设计、开发和测试。通过手写Spring框架,可以更深入地理解Spring的原理和内部机制,提高对框架的使用和调试能力。 ### 回答3: 手写Spring框架一个相当复杂的任务,但我可以简要介绍手写Spring框架的一些关键步骤和组成部分。 1. 依赖注入:Spring框架的核心概念之一是依赖注入。我们需要编写一个容器,负责管理和维护各个对象之间的依赖关系。可以使用反射机制来实现依赖注入。 2. 控制反转:Spring框架通过控制反转(IoC)来管理对象的创建和生命周期。我们需要编写一个BeanFactory,负责加载和实例化对象,并将依赖注入到相应的对象中。 3. 配置文件:手写Spring框架也需要一个配置文件,用于定义对象的依赖关系和属性。我们可以使用XML、注解或者JavaConfig等方式来定义配置文件。 4. AOP支持:Spring框架提供了面向切面编程(AOP)的支持,可以通过编写切面和通知来实现横切关注点的统一处理。我们需要实现一个AOP框架,用于拦截和处理切面逻辑。 5. MVC模式:Spring框架也提供了一个MVC框架,用于处理Web应用程序的请求和响应。我们需要编写一个DispatcherServlet,负责将请求分发给相应的控制器,并处理模型和视图的交互。 6. 整合其他技术:Spring框架还可以与其他技术进行整合,例如数据库访问、事务管理、安全性控制等。我们需要编写相应的模块,将这些技术与Spring框架集成起来。 虽然这只是一个简要的介绍,手写Spring框架一个非常庞大的工程,需要深入理解Spring的原理和设计思想,并具备扎实的Java编程能力。但通过手写Spring框架,我们可以更好地掌握Spring的核心概念和原理,并加深对框架的理解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值