SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_原力计划

 

目录

 SpringBoot介绍_Spring缺点分析

         SpringBoot介绍_什么是SpringBoot

 SpringBoot介绍_SpringBoot核心功能

SpringBoot入门_通过官网搭建项目

 SpringBoot入门_通过IDEA脚手架搭建项目

SpringBoot入门_SpringBoot项目结构

SpringBoot入门_通过Maven搭建项目

 SpringBoot入门_编写Java代码

SpringBoot原理分析_起步依赖

 查看spring-boot-starter-parent起步依赖

 查看spring-boot-starter-web起步依赖

SpringBoot原理分析_自动配置


 

 SpringBoot介绍_Spring缺点分析

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_spring_02

 Spring是一个非常优秀的轻量级框架,以IOC(控制反转)和AOP(面向切面)为思想内核,极大简化了JAVA企业级项目的开发。虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。使用Spring进行项目开发需要在配置文件中写很多代码,所有这些配置都代表了开发时的损耗。

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_spring_03

 除此之外,Spring项目的依赖管理也是一件耗时耗力的事情。在环境搭建时,需要分析要导入哪些库的坐标,而且还需要分析导入与之有依赖关系的其他库的坐标,一旦选错了依赖的版本,随之而来的不兼容问题就会严重阻碍项目的开发进度。比如Spring5.0以上只能使用Junit4.12以上的版本。

 

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_spring_04

 总结
Spring的缺点:

1.配置过于繁琐。
2.引入的依赖过多,版本控制复杂。

 SpringBoot介绍_什么是SpringBoot

SpringBoot对Spring的缺点进行改善和优化,基于约定大于配置的思想,简化了Spring的开发,所谓简化是指简化了Spring中大量的配置文件和繁琐的依赖引入。所以SpringBoot是一个服务于框架的框架,它不是对Spring功能的增强,而是提供了一种快速使用Spring框架的方式。

SpringBoot的优点:
配置简单

1.依赖引入简单
2.提供了一些大型项目的非功能特性,如嵌入式服务器,安全指标,健康监测等。

 SpringBoot介绍_SpringBoot核心功能

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_java_05

 自动配置
     SpringBoot项目自动提供最优配置,同时可以修改默认值满足特定的要求。
起步依赖
SpringBoot的依赖是基于功能的,而不是普通项目的依赖是基于JAR包的。SpringBoot将完成一个功能所需要的所有坐标打包到一起,并完成了版本适配,我们在使用某功能时只需要引入一个依赖即可。

SpringBoot入门_通过官网搭建项目

接下来我们搭建一个SpringBoot项目,并引入SpringMVC的功能,
首先我们可以通过官网搭建项目:

1.访问start.spring.io
2.生成SpringBoot项目

 

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_后端_06

 SpringBoot版本说明:
           SNAPSHOT:快照版,表示开发版本,随时可能修改;
           M1(Mn):M1是milestone的缩写,也就是里程碑版本;

           RC1(RCn):RC1是release candidates的缩写,也就是发布预览版;
           Release:正式版,也可能没有任何后缀也表示正式版

 SpringBoot打包类型说明:
       使用SpringMVC开发的是一个web项目,但由于在SpringBoot中直接嵌入了Tomcat等
       Web容器,所以在使用SpringBoot做Web开发时不需要部署War文件,只需要打成Jar
       包即可。

 SpringBoot入门_通过IDEA脚手架搭建项目

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_spring boot_07

 我们也可以在IDEA中利用脚手架工具搭建项目: 
在IDEA中新建项目,项目类型为Spring Initializr,选择JDK版本
和搭建网站后点击下一步。

 

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_spring boot_08

 脚手架工具也会访问SpringBoot官网进行项目搭建,但SpringBoot官网有时访问速度较慢,我们也可以选择国内的镜像网站https://start.aliyun.com/搭建项目,阿里的脚手架镜像SpringBoot版本有些滞后。

 选择项目参数后,点击下一步

 

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_原力计划_09

 

 选择SpringBoot版本和需要的起步依赖,点击下一步。

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_原力计划_10

SpringBoot入门_SpringBoot项目结构

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_spring_11

 

 接下来我们分析SpringBoot的项目结构:

POM文件

SpringBoot项目必须继承spring-boot-starter-parent,即所有的SpringBoot项目都是spring-boot-starter-parent的子项目。
spring-boot-starter-parent中定义了常用配置、依赖、插件等信息,供SpringBoot项目继承使用。

<parent>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-parent</artifactId>
     <version>2.7.0-M1</version>
     <relativePath/> 
<!-- lookup parentfrom repository -->
</parent>

SpringBoot项目中可以定义起步依赖,起步依赖不是以jar包为单位,而是以功能为单位

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

spring-boot-maven-plugin插件是将项目打包成jar包的插件。
该插件打包后的SpringBoot项目无需依赖web容器,可以直接使用JDK运行

<build>
  <plugins>
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
  </plugins>
</build>

启动类
启动类的作用是启动SpringBoot项目,运行启动类的main方法即可
启动SpringBoot项目。

@SpringBootApplication
public class Springbootdemo2Application {
  public static void main(String[] args) {
  
        SpringApplication.run(Springbootdemo2Application.class, args);
 }
}

配置文件

 由于SpringBoot极大简化了Spring配置,所以只有一个application.properties配置文件,且Spring的自动配置功能使得大部分的配置都有默认配置,该文件的功能是覆盖默认配置信息,该文件不写任何信息都可以启动项目。
启动后默认端口号为8080,我们可以覆盖该配置:

server.port=8888

SpringBoot入门_通过Maven搭建项目

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_spring boot_12

了解了SpringBoot结构后,我们也可以使用Maven手动搭建
SpringBoot项目:

使用Maven创建普通JAVA项目

 

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_spring_13

 

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_spring_14

 

 在pom中添加项目的父工程、起步依赖、插件

<!-- 父工程 -->
<parent>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-parent</artifactId>
     <version>2.7.0-M1</version>
</parent>
     <!-- 起步依赖 -->
<dependencies>
  <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
</dependencies>
<!-- 插件 -->
<build>
  <plugins>
    <plugin>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
  </plugins>
</build>

编写启动类

@SpringBootApplication
public class SpringBootApp {
  public static void main(String[] args)
    {
  
     SpringApplication.run(SpringBootApp.class, args);
    }
}

编写配置文件application.properties

#日志格式
logging.pattern.console=%d{MM/dd
HH:mm:ss.SSS} %clr(%-5level) 
---[%-15thread] %cyan(%-50logger{50}):%msg%n
#端口号
server.port=8888

运行启动类主方法,启动项目

 SpringBoot入门_编写Java代码

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_spring boot_15

 之前搭建的SpringBoot项目已经都整合了SpringMVC,我们编写一
个控制器进行测试:

@Controller
public class MyController {
      @RequestMapping("/hello")
      @ResponseBody
      public String hello(){
          System.out.println("hellospringboot!");
          return "hello springboot!";
 }
}

 启动类在启动时会做注解扫描(@Controller、@Service、@Repository......),扫描位置为同包或者子包下的注解,所以我们要在启动类同级或同级包下编写代码。

 启动项目,访问http://localhost:8888/hello

SpringBoot原理分析_起步依赖

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_原力计划_16

 查看spring-boot-starter-parent起步依赖

按住 Ctrl 点击 pom.xml 中的 spring-boot-starter-parent ,跳转到了 spring-boot-
starter-parent
pom.xml ,发现 spring-boot-starter-parent 的父工程是 spring-boot-
dependencies

 

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_spring_17

 进入 spring-boot-dependenciespom.xml 可以看到,一部分坐标的版本、
依赖管理、插件管理已经定义好,所以SpringBoot工程继承
spring-boot-starter-parent 后已经具备版本锁定等配置了。所以起步依赖
的作用就是进行依赖的传递。

 

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_原力计划_18

 查看spring-boot-starter-web起步依赖

按住 Ctrl 点击 pom.xml 中的 spring-boot-starter-web ,跳转到了 spring-boot-starter-
web
的 pom.xml ,从 spring-boot-starter-web 的 pom.xml 中我们可以发现, spring-
boot-starter-web
就是将web开发要使用的 spring-web 、 spring-webmvc 等坐标进
行了打包,这样我们的工程只要引入 spring-boot-starter-web 起步依赖的坐
标就可以进行web开发了,同样体现了依赖传递的作用。

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_spring_19

SpringBoot原理分析_自动配置

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_spring boot_20

 查看注解 @SpringBootApplication 的源码 

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_java_21

 @SpringBootConfifiguration:等同与@Confifiguration, 既标注该类是Spring的一个配置类

@EnableAutoConfifiguration:SpringBoot自动配置功能 开启

 查看注解 @EnableAutoConfifiguration 的源码

查看注解 @EnableAutoConfifiguration 的源码 

 

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_后端_22

 @Import(AutoConfifigurationImportSelector.class) 导入了   AutoConfifigurationImportSelector 类

 查看AutoConfifigurationImportSelector源码

 查看AutoConfifigurationImportSelector源码 

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_原力计划_23

SpringFactoriesLoader.loadFactoryNames 方法的作用就是从 META-INF/spring.factories 文件中读取指定类对应的类名称列表 

 点开 spring-boot-autoconfigure 的 spring.factories 文件

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_后端_24

有关配置类的信息如下:

 

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_后端_25

上面配置文件存在大量的以 Configuration 为结尾的类名称,这些类 就是存有自动配置信息的类,而 SpringApplication 在获取这些类名后 再加载。

 我们 ServletWebServerFactoryAutoConfifiguration 为例来分析源码:

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_spring_26

 @EnableConfifigurationProperties(ServerProperties.class) 代表加载 ServerProperties 服务器配置属性类。

进入 ServerProperties 类源码如下:

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_spring_27

 prefifix = "server" 表示SpringBoot配置文件中的前缀,SpringBoot会 将配置文件中以server开始的属性映射到该类的字段中。所以配 置网络端口的方式为 server.port

 如果我们没有在配置文件中配置默认端口,SpringBoot就会读 取默认配置,而默认配置存放在 META-INF/spring-configuration-metadata.json 中,打开 spring-boot-autoconfigure 的 spring.factories 文件

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_原力计划_28

 该文件中保存的就是所有默认配置信息。

SpringBoot【SpringBoot介绍、SpringBoot入门、SpringBoot原理分析、SpringBoot原理分析】(一)-全面详解(学习总结---从入门到深化)_java_29