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

2023-07-16 11:09:48

 

目录

 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缺点分析

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

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

 

 总结
Spring的缺点:

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

 SpringBoot介绍_什么是SpringBoot

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

SpringBoot的优点:
配置简单

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

 SpringBoot介绍_SpringBoot核心功能

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

 

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

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

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

 

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

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

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

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

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

 

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

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

 

 

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

 

SpringBoot入门_SpringBoot项目结构

 

 接下来我们分析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结构后,我们也可以使用Maven手动搭建
SpringBoot项目:

使用Maven创建普通JAVA项目

 

 ​​​​​​​

 

 在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项目已经都整合了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原理分析_起步依赖

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

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

 

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

 

 查看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原理分析_自动配置

 查看注解 @SpringBootApplication 的源码 

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

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

 查看注解 @EnableAutoConfifiguration 的源码

查看注解 @EnableAutoConfifiguration 的源码 

 

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

 查看AutoConfifigurationImportSelector源码

 查看AutoConfifigurationImportSelector源码 

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

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

有关配置类的信息如下:

 

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

 我们 ServletWebServerFactoryAutoConfifiguration 为例来分析源码:

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

进入 ServerProperties 类源码如下:

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

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

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

更多推荐

更快更强更稳定:腾讯向量数据库测评

向量数据库:AI时代的新基座人工智能在无处不在影响着我们的生活,而人工智能飞速发展的背后是需要对越来越多的海量数据处理,传统数据库已经难以支撑大规模的复杂数据处理。特别是大模型的出现,向量数据库横空出世。NVIDIACEO黄仁勋在NVIDIAGTCKeynote演讲中首次提到了向量数据库,并强调它在构建专有大型语言模型

【操作系统】进程控制与进程通信

🐌个人主页:🐌叶落闲庭💨我的专栏:💨c语言数据结构javaEE操作系统Redis石可破也,而不可夺坚;丹可磨也,而不可夺赤。操作系统一、进程控制1.1什么是进程控制1.2如何实现进程控制(“原语”实现)1.2.1如何实现原语的“原子性”1.3进程的创建1.4进程的终止1.5进程的阻塞1.6进程的唤醒1.7进程的

阶段性总结:跨时钟域同步处理

对时序图与Verilog语言之间的转化的认识:首先明确工程要实现一个什么功能;用到的硬件实现一个什么功能。要很明确这个硬件的工作时序,即:用什么样的信号,什么变化规则的信号去驱动这个硬件。然后对工程进行模块划分,顶层尽量不要有逻辑设计,尽量只放在子模块里,尽量提升模块复用性。按照模块划分,画出子模块的时序图。重点:再画

全量数据采集:不同网站的方法与挑战

简介在当今数字化时代中,有数据就能方便我们做出很多决策。数据的获取与分析已经成为学术研究、商业分析、战略决策以及个人好奇心的关键驱动力。本文将分享不同网站的全量数据采集方法,以及在这一过程中可能会遇到的挑战。部分全量采集方法1.撞店铺ID(限店铺ID是数字)通过循环店铺ID,我们能够收集店铺内所有在售商品的信息。这一方

SWC 流程

一个arxml存储SWC(可以存多个,也可以一个arxml存一个SWC)一个arxml存储composition(只能存一个)一个arxml存储systemdescription(通过importdbc自动生成system)存储SWC和composition的arxml文件分开,有效的实现了swc的复用。因为SWC的创

30天入门Python(基础篇)——第3天:【变量】与【输出】与【转义符】(万字解析,建议收藏)

文章目录专栏导读作者有话说:上一节课补充(Pychaem界面认识)①编写代码区域②运行代码(多种方法,随便选一种,开心就好)什么是变量(变量的定义)①较标准的回答(引用AI)②大白话解释+图文并茂(我在教学时的方法(标红的异常重要请反复阅读几遍))③举例子Python中如何给表变量取名(Python中变量的特征)取名规

Python 办公自动化之 PDF 操作详解

1、PyMuPDF简介1.介绍在介绍PyMuPDF之前,先来了解一下MuPDF,从命名形式中就可以看出,PyMuPDF是MuPDF的Python接口形式。MuPDFMuPDF是一个轻量级的PDF、XPS和电子书查看器。MuPDF由软件库、命令行工具和各种平台的查看器组成。MuPDF中的渲染器专为高质量抗锯齿图形量身定制

基于传统的三维点云补全方法

目前,三维视觉受到了学术界和工业界的广泛关注,在目标检测、语义分割、三维重建等领域都取得了突破性的进展。然而,一个固有的问题是由于物体遮挡、镜面反射、物体自遮挡、视角变换和传感器分辨率的限制,传感器在真实场景下所获取的数据并不完整,阻碍了下游任务的研究进展。同时,在点云后续一系列的处理中,比如点云去噪、平滑、配准和融合

大数据-玩转数据-Flink SQL编程

一、概念1.1ApacheFlink两种关系型APIApacheFlink有两种关系型API来做流批统一处理:TableAPI和SQL。TableAPI是用于Scala和Java语言的查询API,它可以用一种非常直观的方式来组合使用选取、过滤、join等关系型算子。FlinkSQL是基于ApacheCalcite来实现

【云原生】k8s存储管理中ConfigMap & Secret的使用

目录1ConfigMap1.1简介1.2优点1.3定义ConfigMap1.4使用2Secret2.1简介2.1定义Secret2.2使用1ConfigMap1.1简介在Kubernetes中,ConfigMap是一种用于存储非敏感信息的Kubernetes对象。它用于存储配置数据,如键值对、整个配置文件或JSON数据

【K8S系列】Weave Net 故障排除的常见问题和解决方案

写在前面当使用WeaveNet进行容器网络配置时,可能会遇到一些常见的故障情况。以下是一些常见问题及其解决方案:问题列表1节点无法加入WeaveNet网络解决方案检查节点之间的网络连通性,确保可以通过IP地址相互访问。检查节点的防火墙设置,确保允许WeaveNet的流量通过。确保在每个节点上正确安装了WeaveNet,

热文推荐