SpringBoot 源码解读系列(1)--项目结构分析

        这篇我们来梳理下SpringBoot源码的一些主要项目及用其在创建一个SpringBoot项目是怎样使用的。

   一、SpringBoot项目Demo

   首先我们来看下创建一个简单的springbooot项目需要引用哪些maven包,再分析平下这些包(要具体了解如何创建一个springBoot项目可以看下其他的博文)。

     1、最开始我们需要引用parent包:

<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.0.1.RELEASE</version>
   <relativePath/> <!-- lookup parent from repository -->
</parent>

    2、然后我们需要引用关于mvc的starter

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

   只需要这两个maven引用,同时也不需要再加一些其他的配置,保持其的默认配置。如果你愿意,在application.properties中也可以不进行任何设置,并且这个项目的也不需要像springMVC那样经由tomcat去被动启动,其直接就能启动(当然也可以用其他的服务器)。那么这些SpringBoot是怎样的去处理的呢。在这个SpringBoot源码解读系列我们就来关注这些问题,同时在这个系列我们就不像原来分析spring、springMVC那样具体的分析其的具体源码了,关于SpringBoot源码这里我们就梳理其主要的逻辑。因为看了一下其的实现逻辑,其主要是在Spring及SpringMVC的基础上去去拓展的,也就是Spring及对应SpringMVC解决的问题。对于Spring来说,目前我的理解就是怎样去创建一个Bean,定义SpringMVC来说就是要怎样去进行配对例如处理器、处理器适配器、视图、以及一些拓展的数据库配置、AOP这些的配置使用,但其实这些配置都是一些相对固定的模式,所以SpringBoot就采用默认大于配置、要配置什么就引用什么包,然后springBoot去默认加载,就不需要主动去设置一些固定的内容了。

    前面主要是简单说了一些个人的理解(可能有些误区?毕竟对于这些源码目前我的梳理是对于其核心主要的内容进行梳理,可能会有一些误区,欢迎指正),下面我们回归正题。

   1、下面我们来看下上面引用的maven POM其内部又是怎样去引用的

       1、spring-boot-starter-parent

     我们先来看下spring-boot-starter-parent

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.0.1.RELEASE</version>
    <relativePath>../../spring-boot-dependencies</relativePath>
</parent>

   其内部又引用了spring-boot-dependencies

<properties>
       ........
    <lombok.version>1.16.20</lombok.version>
       ........
    </properties>
<dependencyManagement>
     ...........
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot</artifactId>
            <version>2.0.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-access</artifactId>
            <version>${logback.version}</version>
        </dependency>

    这里主要是(POM文件还有一些其他的设置)确认整个springBoot项目引用的版本号,因为我们知道我们再使用springBoot构建项目的时候,引用maven 包的时候一般不用主动去设置版本号的。(这里需要理解maven的 <dependencyManagement>标签)

    所以这里这个spring-boot-starter-parent的作用主要就是就是确认整个的springBoot项目的版本引用。

    2、spring-boot-starter-web

     下面我们来看下spring-boot-starter-web的依赖引用 

<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starters</artifactId>
   <version>${revision}</version>
</parent>
<dependencies>
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
   </dependency>
    .........
   <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
   </dependency>
   <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
   </dependency>
</dependencies>

    1、   parent

  可以看到其parent是引用的spring-boot-starters

<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-parent</artifactId>
   <version>${revision}</version>
   <relativePath>../spring-boot-parent</relativePath>
</parent>
<modules>
   <module>spring-boot-starter</module>
    ..........
   <module>spring-boot-starter-thymeleaf</module>
   <module>spring-boot-starter-tomcat</module>
   ............
   <module>spring-boot-starter-web</module>
   ...........
</modules>

  这里又引用前面的spring-boot-parent,同时这个spring-boot-starters又通过modules设置这些子项目

  2、dependencies

    spring-boot-starter

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starters</artifactId>
  <version>2.0.5.RELEASE</version>
</parent>
<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot</artifactId>
    <version>2.0.5.RELEASE</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
    <version>2.0.5.RELEASE</version>
    <scope>compile</scope>
  </dependency>
    ............
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.0.9.RELEASE</version>
    <scope>compile</scope>
  </dependency>
   .........
</dependencies>

   这里的dependencies主要引用了两个dependency:spring-boot、spring-boot-autoconfigure。

2、与Maven SpringBoot项目引用的POM来看源码的项目结构

    通过上面创建一个SpringBoot项目的引用,我们来看下SpringBoot源码的结构(这里只看下一些主要的模块,详细的可以看下其他的博文)

                                

     注:我们将spring-boot-starter-web等同于上面指明的spring-boot-starter-activemq,因为spring-boot-starter-web位于下面部分,看不到(从项目结构来说两者是一样的)。

   1、结合上面SpringBoot项目的结构来梳理下这些模块

       首先注意下一些只有POM文件的项目,因为这表明这个模块主要是用于maven项目的引用、管理的,然后 我们再通过前面分析的springBoot项目引用来看下springBoot项目的源码结构

      1、首先是spring-boot-dependenciesdependencyManagement对整个dependecys的版本进行管理,然后是spring-boot-parent对spring-boot-dependencies的引用,同时spring-boot-parent也会dependencyManagement一些公共的包,来完成springBoot项目的版本号设置。

      2、然后就是spring-boot-starter-web来进行starter所需的引用了,下面我们来梳理下spring-boot-starter-web:

     spring-boot-starter-web的parent是spring-boot-starters

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starters</artifactId>
  <version>2.0.5.RELEASE</version>
</parent>
<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-parent</artifactId>
  <version>2.0.5.RELEASE</version>
  <relativePath>../spring-boot-parent</relativePath>
</parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starters</artifactId>
<version>2.0.5.RELEASE</version>

然后starter的dependen(例如spring-boot-starter-web)除了引用与该start本身功能相关的包,例如

<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-web</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-webmvc</artifactId>
</dependency>

还会引用spring-boot-starter(这个应该是每个如同spring-boot-starter-web--spring-boot-starter-xxx,都会引用)

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter</artifactId>
  <version>2.0.5.RELEASE</version>
  <scope>compile</scope>
</dependency>

  然后在这个spring-boot-starter中会引用:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot</artifactId>
    <version>2.0.5.RELEASE</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
    <version>2.0.5.RELEASE</version>
    <scope>compile</scope>
  </dependency>

 所以对于一个spring-boot-starter-web(xxx)来说,其parent为spring-boot-starters通过其去进行对应版本号等的处理,然后再dependency spring-boot-starter来引入一些自动配置的一些注解,例如如果我们自定义配置一些Bean的时候有用到一些注解都是在spring-boot-autoconfigure这个模块中,例如

                  

这个下一篇我们再主要梳理下这些内容

以上这些就是对SpringBoot源码一些比较主要模块结构的了解,下一篇我们再梳理下这些模块的一些主要逻辑及代码处理。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值