SpringBoot3---核心特性---1、快速入门

news2024/11/15 19:50:03

在这里插入图片描述
                       星光下的赶路人star的个人主页

                      年轻人仍然所见有极限,又迷失在太多讯息中–讯息不等于眼界

文章目录

  • 1、简介
    • 1.1 前置知识
    • 1.2 环境要求
    • 1.3 SpringBoot是什么
  • 2、快速体验
    • 2.1 开发流程
    • 2.2 特性小结
    • 2.3 Spring Initializr
  • 3、应用分析
    • 3.1 依赖管理机制
    • 3.2 自动配置机制

1、简介

1.1 前置知识

  • java17
  • Spring、SpringMVC、MyBatis
  • Maven、IDEA

1.2 环境要求

环境&工具版本(or later)
SpringBoot3.0.5+
IDEA2021.2.1+
java17+
Maven3.5+
Tomcat10.0+
Servlet5.0+
GraaIVM22.3+
Native Build Tools0.9.19+

1.3 SpringBoot是什么

SpringBoot帮我们简单、快速的创建一个独立、生产级别的Spring应用(说明:SpringBoot底层是Spring)
大多是SpringBoot应用只需要编写少量配置即可快速整合Spring平台以及第三方技术
特性:

  • 快速创建独立Spring应用
    • SSM:导包、写配置、启动运行
  • 直接嵌入Tomcat、Jetty or Undertow(无需部署war包)【Servlet容器】
    • Linux java tomcat mysql:war放到Tomcat的webapps下
    • jar:java环境:java -jar
  • 重点:提供可选的Starter,简化应用整合
    • 场景启动器(starter):web、json、邮件、oss(对象储存)、异步、定时任务、缓存…
    • 导包一堆,控制好版本
    • 为每一种场景准备了一个依赖:web-starter、MyBatis-starter
  • 重点:按需自动配置Spring以及第三方库
    • 如果这些场景我要使用(生效)。这个创建的所以配置都会自动配置好。
    • 约定大于配置:每个创建都有很多默认配置
    • 自定义:配置文件中修改几项就可以
  • 提供生产级特性:如 监控指标、监控检查、外部化配置等
    • 监控指标、监控检查(k8s)、外部化配置
  • 无代码生成、无xml

总结:简化开发、简化配置、简化整合、简化部署、简化监控、简化运维。

2、快速体验

场景:浏览器发生/hello请求,返回“hello zhm,this is Springboot3”

2.1 开发流程

1、创建项目(Maven项目)

<!--    所有springboot项目都必须继承自 spring-boot-starter-parent -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.0.5</version>
    </parent>

2、导入场景

    <dependencies>
<!--        web开发的场景启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

3、主程序

@SpringBootApplication //这是一个SpringBoot应用
public class MainApplication {

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

4、业务

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello(){

        return "hello zhm,this is Springboot3";
    }

}

5、测试
默认启动访问:localhost:8080
在这里插入图片描述
6、打包

<!--    SpringBoot应用打包插件-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

mvn clean package把项目打成可执行的jar包
java -jar demo.jar启动项目
然后访问的效果是一样的

2.2 特性小结

1、简化整合
导入相关的场景,拥有相关的功能。场景启动器
默认支持的所以场景:https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.build-systems.starters

  • 官方提供的场景:命名为:spring-boot-starter-*
  • 第三方提供场景:命名为:*-spring-boot-starter

场景一导入,万物皆就绪

2、简化开发
无需编写任何配置,直接开发业务

3、简化配置
application.properties:

  • 集中式管理配置。只需要修改这个文件就可以
  • 配置基本都有默认值·
  • 能写的所以配置都在:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties

4、简化部署
打包为可执行的jar包
Linux服务器上有java环境

5、简化运维
修改配置(外部放一个application.properties文件)、监控、监控检查。

2.3 Spring Initializr

一键创建好整个项目结构
在这里插入图片描述

3、应用分析

3.1 依赖管理机制

思考:
1、为什么导入starter-web所有相关依赖都导入进来?

  • 开发什么场景,导入什么场景启动器
  • Maven依赖传递原则。A-B-C:A就拥有B和C
  • 导入场景启动器。场景启动器自动把这个创建的所以核心依赖全部导入进来。

2、为什么版本号都不用写?

  • 每个boot项目都有一个父项目spring-boot-starter-parent
  • parent的父项目是spring-boot-dependencies
  • 父项目版本仲裁自习,把所有常见的jar的依赖版本都声明好了。
  • 比如:mysql-connector-j

3、自定义版本号

  • 利用maven的就近原则
    • 直接在当前项目properties标签中声明父项目用的版本属性的key
    • 直接在导入依赖的时候声明版本

4、第三方的jar包

  • boot父项目没有管理的需要自行声明好
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.16</version>
</dependency>

在这里插入图片描述

3.2 自动配置机制

1、初步理解

  • 自动配置的Tomcat、SpringMVC等
    • 导入场景,容器中就会自动配置好这个场景的核心组件
    • 以前:DispatchServlet、ViewResolver、CharacterEncodingFilter…
    • 现在:自动配置好的这些组件
    • 验证:容器中有了什么组件,就具有什么功能
    public static void main(String[] args) {

        //java10: 局部变量类型的自动推断
        var ioc = SpringApplication.run(MainApplication.class, args);

        //1、获取容器中所有组件的名字
        String[] names = ioc.getBeanDefinitionNames();
        //2、挨个遍历:
        // dispatcherServlet、beanNameViewResolver、characterEncodingFilter、multipartResolver
        // SpringBoot把以前配置的核心组件现在都给我们自动配置好了。
        for (String name : names) {
            System.out.println(name);
        }

    }
  • 默认的包扫描规则
    • @SpringBootApplication 标注的类就是主程序类
    • SpringBoot只会扫描主程序所在的包及其下面的子包,自动的component-scan功能
    • 自定义扫描路径
      • @SpringBootApplication(scanBasePackages=“com.zhm”)
      • @ComponentScan(“com.zhm”)直接指定扫描的路径
  • 配置默认值
    • 配置文件的所以配置项和某个类的对象值进行一一绑定。
    • 绑定了配置文件中每一项值的类:属性类
    • 比如:
      • ServerProperties 绑定了所有Tomcat服务器有关的配置
      • MultipartProperties绑定了所有文件上传相关的配置
      • 参照官方文档:或者参照绑定的属性类
  • 按需加载配置
    • 导入场景spring-boot-starter-web
    • 场景启动器除了会导入相关功能依赖,导入一个spring-boot-starter,是所以starter的starter,基础核心starter
    • spring-boot-starter导入了一个包spring-boot-autoconfigure。包里面都是各种场景的Autoconfiguration自动配置类。
  • 虽然全场景的自动配置都在spring-boot-autoconfigure这个包,但是不是全都开启的。
    • 导入哪个场景就开启哪个自动配置

总结:导入场景启动器,触发spring-boot-autoconfigure这个包的自动配置生效、容器中就会具有相关场景的功能。

2、完整流程
在这里插入图片描述
自动配置流程细节梳理:
1、导入starter-web:导入了web开发场景
(1)创建启动器导入了相关场景的所以依赖:starter-json、starter-tomcat、springmvc
(2)每个场景启动器都引入了一个spring-boot-starter,核心场景启动器
(3)核心场景启动器引入了spring-boot-autoconfigure包
(4)spring-boot-autoconfigure里面囊括了所以场景的所有配置
(5)只要这个包下的所有类都能生效,那么相当于SpringBoot官方写好的整合功能就能生效了
(6)SpringBoot默认却扫描不到spring-boot-autoconfigure下写好的所有配置类(这些配置类给我们做了整合操作),默认值扫描主程序所在的包。

2、主程序:@SpringBootApplication
(1)@SpringBootApplication由三个注解组成@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan
(2)SpringBoot默认只能扫描自己主程序所在的包以及下面的子包,扫描不到spring-boot-autoconfigure包中官方写好的配置类
(3)@EnableAutoConfiguration:SpringBoot开启自动配置的核心

  • 是由@Import(AutoConfigurationImportSelector.class)提供功能:批量给容器中导入组件。
  • SpringBoot启动会默认加载142个配置类
  • 这142个配置类来着于Spring-boot-autoconfigure下META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件指定的
  • 项目启动的时候利用@Import批量导入组件机制把autoconfigure包下的142 xxxAutoConfiguration类导入进来(自动配置类)
  • 虽然导入了142个配置类
    (4)按需生效
  • 并不是142个配置类都能生效
  • 每一个自动配置类,都有条件注解@Conditionalxxx,只有条件成立,才能生效

3、xxxxAutoConfiguration自动配置类

  • 给容器中使用@Bean放一堆组件
  • 每个自动配置类都可能有这个注解@EnableConfigurationProperties(ServerProperties.class),用来配置文件中配的指定前缀的属性值封装到xxxProperties属性类中。
  • 以Tomcat为例:把服务器的所有配置都是以Server开头的。配置都封装到了属性类中
  • 给容器中放的所有组件的一些核心参数,都来自于xxxProperties。xxxProperties都是和配置文件绑定的。
  • 只需要改配置文件的值,核心组件的底层参数都能修改

4、写业务,全程无效关心各种整合(底层这些整合写好了,而且也生效了)

核心流程总结:
1、导入starter,就会导入autoconfigure包
2、autoconfigure包里有一个文件META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,里面指定的所有启动要加载的自动配置类
3、@EnableAutoConfiguration 会自动的把上面文件里面写的所有自动配置类都导入进来。
xxxAutoConfiguration是有条件注解进行按需加载的
4、xxxAutoConfiguration给容器中导入一堆组件,组件都是从xxxProperties中提前属性值
5、xxxProperties又是和配置文件进行了绑定

效果:导入starter、修改配置文件、就能修改底层行为。

3、如何学好SpringBoot
框架的框架、底层属于Spring。能调整每一个场景的底层行为。100%项目一定会用到底层自定义

摄影举例:

  • 傻瓜:自动配置好
  • 单反:焦距、光圈、快门、感光度…
  • 傻瓜+单反:
    • 1、理解自动配置原理
      • a.导入starter–>生效xxxAutoConfiguration —>组件—>xxxProperties—>配置文件
    • 2、理解其他框架底层
      • a.拦截器
    • 3、可以随时定制化任何组件
      • a.配置文件
      • b.自定义组件

普通开发:导入starter,Controller、Service、Mapper、偶尔修改配置文件
高级开发:自定义组件、自定义配置、自定义starter
核心:

  • 这个场景自动配置导入了哪些组件,我们能不能AutoWired进来使用
  • 能不能通过修改配置组件的一些默认参数
  • 需不需要自己完全定义这个组件
  • 场景定制化

最佳实战:

  • 选场景,导入项目
    • 官方:starter
    • 第三方:去仓库搜
  • 写配置,改配置文件关键项
    • 数据库参数(连接地址、账户密码…)
  • 分析这个场景给我们导入了哪些能用的组件
    • 自动装配这些组件进行后续使用
    • 不满意boot提供的自动配置好的默认组件
      • 定制化(改配置、自定义组件)

整合Redis:

  • 选场景:
    • spring-boot-starter-data-redis
    • 场景AutoConfiguration就是这个场景的自动配置类
  • 写配置:
    • 分析到这个场景的自动配置类开启了哪些属性绑定关系
    • @EnableConfigurationProperties(RedisProperties.class)
    • 修改Redis相关的配置
  • 分析组件:
    • 分析到RedisAutoconfiguration给容器中放了StringRedisTemplate
    • 给业务代码中自动装配StringRedisTemplate
  • 定制化
    • 修改配置文件
    • 自定义组件,自己给容器中放一个StringRedisTemplate

在这里插入图片描述
                      您的支持是我创作的无限动力

在这里插入图片描述
                      希望我能为您的未来尽绵薄之力

在这里插入图片描述
                      如有错误,谢谢指正;若有收获,谢谢赞美

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/833592.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工作日志怎么写?聪明灵犀能帮你撰写

工作日志怎么写&#xff1f;工作日志是每个职场人士都需要编写的重要文档之一&#xff0c;它记录了我们在工作中所做的事情、遇到的问题以及解决方法等重要信息。然而&#xff0c;写工作日志并不是一件容易的事情&#xff0c;特别是对于那些不擅长记录的人来说。不过&#xff0…

go 语言实战入门案例之实现Socks5

文章和代码已经归档至【Github仓库&#xff1a;https://github.com/timerring/backend-tutorial 】或者公众号【AIShareLab】回复 go 也可获取。 文章目录 实现 Socks 5 代理介绍原理TCP echo serverauth请求阶段完整代码 学习路线推荐 实现 Socks 5 代理 介绍 socks5 协议它虽…

2023 8-2 ~ 8-3

2181 合并0之间的节点 思路挺简单 就是注意一下指针不要制空 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNod…

【Linux】在服务器上创建Crontab(定时任务),自动执行shell脚本

业务场景&#xff1a;该文即为上次编写shell脚本的姊妹篇,在上文基础上,将可执行的脚本通过linux的定时任务自动执行,节省人力物力,话不多说,开始操作! 一、打开我们的服务器连接工具 连上服务器后,在任意位置都可以执行:crontab -e 如果没有进入编辑cron任务模式 根据提示查看…

瑞吉外卖实战-笔记

软件开发的流程 角色分工 软件环境 开发环境的搭建 数据库环境 maven环境 1.创建完成后&#xff0c;需要检查一下编码、maven仓库、jdk等 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</a…

Java 监听Mysql binlog

使用 mysql-binlog-connector-java 1. mysql-binlog-connector-java 官网 2. Java代码中&#xff0c;如何监控Mysql的binlog&#xff1f; 前置条件 1. mysql服务器表结构 CREATE TABLE student (id int NOT NULL AUTO_INCREMENT,name varchar(255) CHARACTER SET utf8mb4 C…

meedu二次开发:企业内部使用 必须登录之后才能查看里面内容

meedu二次开发&#xff1a;修改成企业内部培训系统功能 用户必须登录之后才能查看里面课程内容

20天学rust(一)和rust say hi

关注我&#xff0c;学习Rust不迷路 工欲善其事&#xff0c;必先利其器。第一节我们先来配置rust需要的环境和安装趁手的工具&#xff0c;然后写一个简单的小程序。 安装 Rust环境 Rust 官方有提供一个叫做 rustup 的工具&#xff0c;专门用于 rust 版本的管理&#xff0c;网…

安全学习DAY14_JS信息打点

信息打点——前端JS框架 文章目录 信息打点——前端JS框架小节概述-思维导图JS安全概述什么是JS渗透测试&#xff1f;前后端差异JS安全问题流行的Js框架如何判定JS开发应用&#xff1f; 测试方法&#xff08;JS文件的获取以及分析方法1、手工搜索分析2、半自动Burp分析插件介绍…

实数信号的傅里叶级数研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

临床球囊扩张术中的压力精密控制解决方案

摘要&#xff1a;目前临床用气管导管套囊压力管理中缺乏操作简便和技术成熟的套囊压力自动控制仪器&#xff0c;现有压力测量和控制装置操作繁琐&#xff0c;存在充气增压和放气减压过程不及时和压力不稳定等问题。针对这些问题本文提出了套囊压力自动控制解决方案&#xff0c;…

ad+硬件每日学习十个知识点(20)23.7.31 (芯片和天线间的巴伦电路)

文章目录 1.什么是前端电路&#xff1f;2.什么是巴伦电路&#xff1f;3.巴伦电路的性能参数4.LC巴伦电路5.ADS是干什么的&#xff1f;6.HFSS是干什么的&#xff1f;7.ANSYS有限元软件8.常用的电路仿真软件都有什么&#xff1f;9.巴伦电路的复端阻抗LC10.微带巴伦&#xff08;不…

RuntimeException:Duplicate class xxx found in modules xxx and xxx依赖冲突

在开发的过程中因为多个项目混杂&#xff0c;依赖冲突 在Terminal 中运行gradlew -q app:dependencies查看依赖树。 然后根据依赖树中的版本进行依赖排除&#xff0c;排除低版本的依赖或者冲突的依赖包 implementation (org.web3j:core:4.8.7-android){exclude group:org.bou…

LED光源均匀通用积分球

积分球又称光通球&#xff0c;是一个中空的完整球壳。内壁涂白色漫反射涂料&#xff0c;并且球内壁不同点漫射均衡。采用积分球测量光通量时&#xff0c;能够确保测量结果的可靠性&#xff0c;其可降低并过滤因光线形状、发散角度以及检测部件中不同位置相应度差异引起的测量误…

企业既要用u盘又要防止u盘泄密怎么办?

企业在日常生产生活过程中&#xff0c;使用u盘交换数据是最企业最常用也是最便携的方式&#xff0c;但是在使用u盘的同时&#xff0c;也给企业的数据保密工作带来了很大的挑战&#xff0c;往往很多情况下企业的是通过u盘进行数据泄漏的。很多企业采用一刀切的方式&#xff0c;直…

idea数据库快速上手-库操作与表结构和数据操作

引言 对数据库的操作无非就是执行SQL语句&#xff0c;要想熟练操作数据库&#xff0c;就要熟练运用SQL语句。 一&#xff0c;数据库操作 展示当前服务器内的数据库 -- 展示服务器内的数据库 show databases; show schemas; 执行结果&#xff1a; 创建数据库&#xff1a; --…

Matlab对TMS320F28335编程-新建工程闪烁led灯

前言 工具&#xff1a;Matlab2022b Matlab对接C2000插件&#xff0c;下载连接如下 Embedded Coder Support Package for Texas Instruments C2000 Processors - File Exchange - MATLAB Central 在Matlab中加载此插件后&#xff0c;按照要求一步一步的进行就可以&#xff0c…

JVM 学习—— 类加载机制

前言 在上一篇文章中&#xff0c;荔枝梳理了有关Java中JVM体系架构的相关知识&#xff0c;其中涉及到的有关Java类加载机制的相关知识并没有过多描述。那么在这篇文章中&#xff0c;荔枝会详细梳理一下有关JVM的类加载机制和双亲委派模型的知识&#xff0c;希望能够帮助到有需要…

负数的二进制转换成十进制

对于一个k位的二进制正数&#xff0c;其表示成十进制的结果是&#xff1a; pos[i]表示&#xff1a;这个正数的二进制形式的第i位是1。 i从最低位&#xff08;第0位&#xff09;开始&#xff0c;一直到k-1位。有符号数中&#xff0c;正数的第k-1为0&#xff0c;负数的第k-1位为…

ASP.NET Core学习路线图

说明 1. 先决条件 - [C#](https://www.pluralsight.com/paths/csharp) - [Entity Framework](https://www.pluralsight.com/search?qentity%20framework%20core) - [ASP.NET Core](https://www.pluralsight.com/search?qasp.net%20core) - SQL基础知识 2. 通用开发技能 -…