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

在这里插入图片描述
                       星光下的赶路人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)
SpringBoot 3.0.5+
IDEA 2021.2.1+
java 17+
Maven 3.5+
Tomcat 10.0+
Servlet 5.0+
GraaIVM 22.3+
Native Build Tools 0.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项目)


    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>3.0.5version>
    parent>

2、导入场景

    <dependencies>

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        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
SpringBoot3---核心特性---1、快速入门_第1张图片
6、打包


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
            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

一键创建好整个项目结构
SpringBoot3---核心特性---1、快速入门_第2张图片

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父项目没有管理的需要自行声明好

<dependency>
    <groupId>com.alibabagroupId>
    <artifactId>druidartifactId>
    <version>1.2.16version>
dependency>

SpringBoot3---核心特性---1、快速入门_第3张图片

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、完整流程
SpringBoot3---核心特性---1、快速入门_第4张图片
自动配置流程细节梳理:
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

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

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

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

你可能感兴趣的:(SpringBoot3,redis,springboot,spring,maven,intellij-idea)