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

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

   一、SpringBoot项目Demo

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

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


   org.springframework.boot
   spring-boot-starter-parent
   2.0.1.RELEASE
    

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


   org.springframework.boot
   spring-boot-starter-web

   只需要这两个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


    org.springframework.boot
    spring-boot-dependencies
    2.0.1.RELEASE
    ../../spring-boot-dependencies

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


       ........
    1.16.20
       ........
    

     ...........
    
        
            org.springframework.boot
            spring-boot
            2.0.1.RELEASE
        
        
            ch.qos.logback
            logback-access
            ${logback.version}
        

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

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

    2、spring-boot-starter-web

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


   org.springframework.boot
   spring-boot-starters
   ${revision}

   
      org.springframework.boot
      spring-boot-starter
   
    .........
   
      org.springframework
      spring-web
   
   
      org.springframework
      spring-webmvc
   

    1、   parent

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


   org.springframework.boot
   spring-boot-parent
   ${revision}
   ../spring-boot-parent

   spring-boot-starter
    ..........
   spring-boot-starter-thymeleaf
   spring-boot-starter-tomcat
   ............
   spring-boot-starter-web
   ...........

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

  2、dependencies

    spring-boot-starter


  org.springframework.boot
  spring-boot-starters
  2.0.5.RELEASE

  
    org.springframework.boot
    spring-boot
    2.0.5.RELEASE
    compile
  
  
    org.springframework.boot
    spring-boot-autoconfigure
    2.0.5.RELEASE
    compile
  
    ............
  
    org.springframework
    spring-core
    5.0.9.RELEASE
    compile
  
   .........

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

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

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

                                SpringBoot 源码解读系列(1)--项目结构分析_第1张图片

     注:我们将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


  org.springframework.boot
  spring-boot-starters
  2.0.5.RELEASE

  org.springframework.boot
  spring-boot-parent
  2.0.5.RELEASE
  ../spring-boot-parent

org.springframework.boot
spring-boot-starters
2.0.5.RELEASE

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


   org.springframework
   spring-web


   org.springframework
   spring-webmvc

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


  org.springframework.boot
  spring-boot-starter
  2.0.5.RELEASE
  compile

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


  
    org.springframework.boot
    spring-boot
    2.0.5.RELEASE
    compile
  
  
    org.springframework.boot
    spring-boot-autoconfigure
    2.0.5.RELEASE
    compile
  

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

SpringBoot 源码解读系列(1)--项目结构分析_第2张图片                  SpringBoot 源码解读系列(1)--项目结构分析_第3张图片

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

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

 

你可能感兴趣的:(#,Spring系列,SpringBoot源码,java)