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

     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项目继承使用。

    1. <parent>
    2.   <groupId>org.springframework.boot</groupId>
    3.    <artifactId>spring-boot-starter-parent</artifactId>
    4.    <version>2.7.0-M1</version>
    5.    <relativePath/>
    6. <!-- lookup parentfrom repository -->
    7. </parent>

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

    1. <dependencies>
    2.    <dependency>
    3.   <groupId>org.springframework.boot</groupId>
    4.      <artifactId>spring-boot-starter-web</artifactId>
    5.    </dependency>
    6.    <dependency>
    7.   <groupId>org.springframework.boot</groupId>
    8.      <artifactId>spring-boot-starter-test</artifactId>
    9.      <scope>test</scope>
    10.    </dependency>
    11. </dependencies>

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

    1. <build>
    2.   <plugins>
    3.     <plugin>
    4.   <groupId>org.springframework.boot</groupId>
    5.        <artifactId>spring-boot-maven-plugin</artifactId>
    6.     </plugin>
    7.   </plugins>
    8. </build>

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

    1. @SpringBootApplication
    2. public class Springbootdemo2Application {
    3.   public static void main(String[] args) {
    4.   
    5.   SpringApplication.run(Springbootdemo2Application.class, args);
    6.  }
    7. }

    配置文件

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

    server.port=8888 

    SpringBoot入门_通过Maven搭建项目

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

    使用Maven创建普通JAVA项目

     

     ​​​​​​​

     

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

    1. <!-- 父工程 -->
    2. <parent>
    3.   <groupId>org.springframework.boot</groupId>
    4.    <artifactId>spring-boot-starter-parent</artifactId>
    5.    <version>2.7.0-M1</version>
    6. </parent>
    7. <!-- 起步依赖 -->
    8. <dependencies>
    9.   <dependency>
    10. <groupId>org.springframework.boot</groupId>
    11.      <artifactId>spring-boot-starter-web</artifactId>
    12.   </dependency>
    13. </dependencies>
    14. <!-- 插件 -->
    15. <build>
    16.   <plugins>
    17.     <plugin>
    18.   <groupId>org.springframework.boot</groupId>
    19.        <artifactId>spring-boot-maven-plugin</artifactId>
    20.     </plugin>
    21.   </plugins>
    22. </build>

    编写启动类

    1. @SpringBootApplication
    2. public class SpringBootApp {
    3.   public static void main(String[] args)
    4. {
    5.   
    6.   SpringApplication.run(SpringBootApp.class, args);
    7.   }
    8. }

    编写配置文件application.properties

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

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

     SpringBoot入门_编写Java代码

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

    1. @Controller
    2. public class MyController {
    3.    @RequestMapping("/hello")
    4.    @ResponseBody
    5.    public String hello(){
    6.      System.out.println("hellospringboot!");
    7.      return "hello springboot!";
    8.  }
    9. }

     启动类在启动时会做注解扫描(@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 文件

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

  • 相关阅读:
    平均分(C++)
    哪些重生奇迹mu地图适合刷玛雅宝石?
    Pandas列中的字典/列表拆分为单独的列
    若依框架使用mars3d的环境配置,地球构建
    websocket聊天时如何识别不同的用户呢?
    31.springboot中的注解总结(spring,springmvc,springboot,mybatis,dubbo)
    SpringMVC之CRUD和文件上传下载
    InputStream输入字节流
    Momentum Contrast for Unsupervised Visual Representation Learning 论文学习
    管理团队相关的梳理
  • 原文地址:https://blog.csdn.net/m0_58719994/article/details/131748235