SpringBoot(详细介绍)

目录

一、简介

1.1、什么是SpringBoot

1.2.、特性

1.3、四大核心

1.4、特点

二、快速入门

2.1、开发流程

2.1.1、创建项目

maven项目

2.1.2、导入场景

场景启动器

2.1.3、主程序

2.1.4、业务

三、Spring Initializr 创建向导

3.1、依赖管理机制 

3.1.1、为什么导入starter-web所有相关依赖都导入进来? 

3.1.2、为什么版本号不用写?

3.1.3、自定义版本号

3.1.4、第三方的jar包

四、自动配置机制

4.1、 初步理解

4.2、 完整流程


一、简介

1.1、什么是SpringBoot

        我们知道,从 2002 年开始,Spring 一直在飞速的发展,如今已经成为了在Java EE(Java Enterprise Edition)开发中真正意义上的标准,但是随着技术的发展,Java EE使用 Spring 逐渐变得笨重起来,大量的 XML 文件存在于项目之中。繁琐的配置,整合第三方框架的配置问题,导致了开发和部署效率的降低。

        2012 年 10 月,Mike Youngstrom 在 Spring jira 中创建了一个功能请求,要求在 Spring 框架中支持无容器 Web 应用程序体系结构。他谈到了在主容器引导 spring 容器内配置 Web 容器服务。这是 jira 请求的摘录:

        我认为 Spring 的 Web 应用体系结构可以大大简化,如果它提供了从上到下利用 Spring 组件和配置模型的工具和参考体系结构。在简单的 main()方法引导的 Spring 容器内嵌入和统一这些常用Web 容器服务的配置。

        这一要求促使了 2013 年初开始的 Spring Boot 项目的研发,到今天,Spring Boot 的版本已经到了 2.0.3 RELEASE。Spring Boot 并不是用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具。

        它集成了大量常用的第三方库配置,Spring Boot应用中这些第三方库几乎可以是零配置的开箱即用(out-of-the-box),大部分的 Spring Boot 应用都只需要非常少量的配置代码(基于 Java 的配置),开发者能够更加专注于业务逻辑。

1.2.、特性

  • 快速创建独立 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

1.3、四大核心

自动配置、起步依赖、Actuator、命令行界面

1.4、特点

简化开发,简化配置,简化整合,简化部署,简化监控,简化运维。

二、快速入门

2.1、开发流程

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.1.2、导入场景
场景启动器
 <dependencies>
<!--        web开发的场景启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
2.1.3、主程序
@SpringBootApplication //这是一个SpringBoot应用
public class MainApplication {

    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class,args);
    }
}
2.1.4、业务
@RestController
public class HelloController {

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

        return "Hello,Spring Boot 3!";
    }

}

2.1.5、测试

默认启动访问:localhost:8080

三、Spring Initializr 创建向导

一键创建好整个项目结构

3.1、依赖管理机制 

3.1.1、为什么导入starter-web所有相关依赖都导入进来? 
  • 开发什么场景,导入什么场景启动器。
  • maven依赖传递原则。A-B-C: A就拥有B和C
  • 导入 场景启动器。 场景启动器 自动把这个场景的所有核心依赖全部导入进来
3.1.2、为什么版本号不用写?
  • 每个boot项目都有一个父项目spring-boot-starter-parent
  • parent的父项目是spring-boot-dependencies
  • 父项目 版本仲裁中心,把所有常见的jar的依赖版本都声明好了。
  • 比如:mysql-connector-j
3.1.3、自定义版本号
  • 利用maven的就近原则

    • 直接在当前项目properties标签中声明父项目用的版本属性的key

    • 直接在导入依赖的时候声明版本

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

 

四、自动配置机制

4.1、 初步理解

  • 自动配置的Tomcat、SpringMVC等
    • 导入场景,容器中就会自动配置好这个场景的核心组件。
    • 以前:DispatcherServlet、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.atguigu")
      • @ComponentScan("com.atguigu") 直接指定扫描的路径
  • 配置默认值
    • 配置文件的所有配置项是和某个类的对象值进行一一绑定的。
    • 绑定了配置文件中每一项值的类: 属性类
    • 比如:
      • ServerProperties绑定了所有Tomcat服务器有关的配置
      • ....参照官方文档:或者参照 绑定的 属性类
      • MultipartProperties绑定了所有文件上传相关的配置
  • 按需加载自动配置
    • 导入场景spring-boot-starter-web
      • 场景启动器除了会导入相关功能依赖,导入一个spring-boot-starter,是所有starterstarter,基础核心starter
      • spring-boot-starter导入了一个包 spring-boot-autoconfigure。包里面都是各种场景的AutoConfiguration自动配置类
      • 虽然全场景的自动配置都在 spring-boot-autoconfigure这个包,但是不是全都开启的。
        • 导入哪个场景就开启哪个自动配置

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

4.2、 完整流程

 

自动配置流程细节梳理:

1、导入starter-web:导入了web开发场景

  • 1、场景启动器导入了相关场景的所有依赖:starter-jsonstarter-tomcatspringmvc
  • 2、每个场景启动器都引入了一个spring-boot-starter,核心场景启动器。
  • 3、核心场景启动器引入了spring-boot-autoconfigure包。
  • 4、spring-boot-autoconfigure里面囊括了所有场景的所有配置。
  • 5、只要这个包下的所有类都能生效,那么相当于SpringBoot官方写好的整合功能就生效了。
  • 6、SpringBoot默认却扫描不到 spring-boot-autoconfigure下写好的所有配置类。(这些配置类给我们做了整合操作),默认只扫描主程序所在的包

2、主程序@SpringBootApplication

  • 1、@SpringBootApplication由三个注解组成@SpringBootConfiguration@EnableAutoConfiguratio@ComponentScan
  • 2、SpringBoot默认只能扫描自己主程序所在的包及其下面的子包,扫描不到 spring-boot-autoconfigure包中官方写好的配置类
  • 3、@EnableAutoConfiguration:SpringBoot 开启自动配置的核心
    • 1. 是由@Import(AutoConfigurationImportSelector.class)提供功能:批量给容器中导入组件。
    • 2. SpringBoot启动会默认加载 142个配置类。
    • 3. 这142个配置类来自于spring-boot-autoconfigureMETA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件指定的
    • 项目启动的时候利用 @Import 批量导入组件机制把 autoconfigure 包下的142 xxxxAutoConfiguration类导入进来(自动配置类
    • 虽然导入了142个自动配置类
  • 4、按需生效:
    • 并不是这142个自动配置类都能生效
    • 每一个自动配置类,都有条件注解@ConditionalOnxxx,只有条件成立,才能生效

3、xxxxAutoConfiguration自动配置类

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JRebel and XRebel 插件在IDEA中的安装、激活和使用

1、JRebel安装 1、打开idea->setting->plugins->Marketplace 2、搜索插件JRebel and XRebel&#xff0c;点击安装&#xff0c;然后重启idea 如果左侧出现JRebel & XRebel代表已安装 3.离线安装JRebel 根据自己安装的idea版本进行下载电影的jrebel https://plugi…

H5小游戏,象棋

H5小游戏源码、JS开发网页小游戏开源源码大合集。无需运行环境,解压后浏览器直接打开。有需要的,私信本人,发演示地址,可以后再订阅,发源码,含60+小游戏源码。如五子棋、象棋、植物大战僵尸、开心消消乐、扑鱼达人、飞机大战等等 <!DOCTYPE html PUBLIC "-//W3C/…

spring学习简单总结(尚硅谷视频

spring学习简单总结 spring-tx-事务注解添加用注解方式进行aop的配置基于注解配置类进行ioc和di的配置 spring-tx-事务注解添加 选择对应事务管理器实现加入到ioc容器 使用注解指定哪些方法需要添加事务 用注解指定方法 用注解方式进行aop的配置 写自己正常的核心业务代…

Python学习 day07(JSON、format()函数)

JSON 各种编程语言存储数据的容器不尽相同&#xff0c;在Python中有字典dict这样的数据类型&#xff0c;而其他语言可能没有对应的字典&#xff0c;为了让不同的语言都能够相互通用的传递数据&#xff0c;JSON就是一种非常良好的中转数据格式&#xff0c;如下&#xff1a; JSON…

前端工具网站合集(持续更新)

综合类网站 那些免费的砖 统计推荐免费工具网站 那些免费的砖 - 优雅地白嫖各种免费资源 (thosefree.com)https://www.thosefree.com/ CSS样式网站 毒蘑菇-配色 CSS 配色&#xff0c;阴影网站 一个好用的配色网站! 毒蘑菇 - 配色 (dumogu.top)https://color.dumogu.top/ …

navicat想把自己库中的表导出给别人的操作

navicat导出表和导入表 导出 右键需要导出的表&#xff0c;选择导出向导 选择csv&#xff0c;然后点击下一步 到这个页面&#xff0c;其实可以不用选择&#xff0c;会自己选择当时选中的表&#xff0c;如果有多张表导出&#xff0c;可以选择其他表。然后点击下一步 到这里是选…

【Django】执行查询——查询JSONField

JSONField 本篇的例子以下面这个模型为基础&#xff1a; from django.db import modelsclass Dog(models.Model):name models.CharField(max_length200)data models.JSONField(nullTrue)def __str__(self):return self.name保存和查询None值 在使用JSONField时&#xff0c…

springboot+jsp汽车配件管理系统idea maven 项目lw

springbootweb汽车配件销售业绩管理系统服务于汽车配件公司业务,实现了客户管理&#xff0c;主要负责对客户相关数据的增删改查方面、渠道管理&#xff0c;主要对渠道信息也就是设备的供应商渠道信息进行管理、项目管理&#xff0c;主要是一些项目信息的记录与整理、销售数据管…

【Photoshop2020版本】零基础笔记(一)

哈喽大家好~最近博客内容换方向了哈哈哈~换成“实用版”了。 今天给大家带来的是 PS 相关内容 其实我也是刚学PS&#xff0c;所以想着自己做笔记还不如发布出去&#xff0c;让大家都能看到&#xff0c;有兴趣的伙伴们&#xff0c;可以跟着我的笔记一块学习&#xff0c;这个专…

Python-Numpy-计算矩阵相乘

向量化矩阵计算公式&#xff1a; """ Title: matrix_calculating Time: 2024/3/6 Author: Michael Jie """import numpy as npw np.array([[1, 2]]) x np.array([[1, 1], [2, 3], [4, 5]]) b 1# w * x b print(w * x b) """…

Cookie属性HttpOnly引起的漏洞解决方案

问题描述&#xff1a; 项目扫描的时候出一个漏洞&#xff0c;Cookie未配置HttpOnly标志。那HttpOnly是什么呢&#xff1f;Httponly是微软对cookie做的扩展。这个主要是解决用户的cookie可能被盗用的问题。在web应用中、JSESSIONID (Cookie)没有设置Httponly属性可能会窃取或操…

越来越多的上市企业进行FTP替代,真相是什么?

FTP协议大家并不陌生&#xff0c;它是用于在网络上进行文件传输的一套标准协议&#xff0c;基于TCP传输&#xff0c;工作在OSI模型的第七层。FTP协议包括两个主要组成部分&#xff1a;FTP服务器和FTP客户端。FTP服务器用于存储文件&#xff0c;而用户则可以使用FTP客户端通过FT…

SORA技术解析

sora文生视频 sora视频生成过程&#xff1a;视频编码加噪降噪视频解码 视频压缩网络实现降维 时空patches统一视频分割 transformer架构凸显“scaling law”的暴力美学 数据资源更为丰富 参考资料&#xff1a; 1.sora技术报告

【三维重建】相移法+格雷码

本篇文章介绍一种稠密点云的获取方式——条纹结构光三维重建算法。 在学习此算法前&#xff0c;我们需要对基于视觉的三维重建算法有一定了解。 需要了解什么是相机模型、相机标定以及三角化的相关知识。 【三维重建】摄像机几何-CSDN博客 【三维重建】摄像机标定&#xff…

服务永不止步!苏州金龙圆满护航2024年春运

为期40天的2024年春运于3月5日正式落下帷幕。今年春运40天全社会跨区域人员流动量预计累计超84亿人次&#xff0c;在流动量创历史新高的同时还遭遇了冻雨、暴雪等多重考验。但是在社会各界通力合作下&#xff0c;各地运输工作仍然有条不紊地进行&#xff0c;最终克服重重困难&a…

[C语言]——scanf和printf介绍

目录 一.printf 1.基本用法 2.占位符 3.占位符列举 4.输出格式 4.1限定宽度 4.2总是显示正负号 4.3限定小数位数 4.4输出部分字符串 二.scanf 1.基本用法 2.scanf的返回值 3.占位符 4.赋值忽略符 一.printf 1.基本用法 printf() 的作⽤是将参数⽂本输出到屏幕。…

CSS 之 background 系列属性详解

一、background总览 1、简介 background属性是所有背景属性的缩写&#xff0c;通常建议在代码中使用该缩写属性&#xff0c;而不是使用多条单独的背景属性&#xff0c;因为该缩写属性在老版本浏览器中支持性更好&#xff0c;而且书写简便。未写在缩写属性中的其他背景属性&am…

软件设计师软考题目解析20之英语题

想说的话&#xff1a;要准备软考了。0.0&#xff0c;其实我是不想考的&#xff0c;但是吧&#xff0c;由于本人已经学完所有知识了&#xff0c;只是被学校的课程给锁在那里了&#xff0c;不然早找工作去了。寻思着反正也无聊&#xff0c;就考个证玩玩。 本人github地址&#xf…

Claude 3家族惊艳亮相:AI领域掀起新浪潮,GPT-4面临强劲挑战

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-agd7RSCGMblYxo85 {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

Qt 使用QListView实现简约美观的聊天窗口

今天和大家分享一个使用QListView来展现聊天窗口的历史记录的例子, 因为聊天记录可能会有很多, 所以使用试图-模型的方式更加合理 这是最终效果: ChatHistoryModel继承自QAbstractListModel , ChatHistoryViewDelegate继承自QStyledItemDelegate, 这个例子最关键的就是在QSty…