当前位置: 首页 > news >正文

SpringBoot核心功能与基础配置

SpringBoot简介

原先的Spring程序缺点,包括依赖设置繁琐,每项jar的引用都需要自己撰写。并且配置繁琐,配置文件中也需要自己写加载bean等。由此针对原始的Spring程序,Pivotal团队提供的全新框架——SpringBoot,其设计目的是用来简化Spring应用的初始搭建以及开发过程

1. SpringBoot的核心功能及优点

  • 起步依赖(简化依赖配置)
  • 自动配置(简化常用工程相关配置)
  • 辅助功能(内置服务器,……)

1.1 Parent

在进行开发时,对依赖版本具有固定搭配,故SpringBoot将所有基本版本常见的方案进行了整理,开发者可直接使用其提供的版本方案,不用担心冲突。故SpringBoot提供了parentparent自身具有很多个版本,每个parent版本中包含有几百个其他技术的版本号。parent帮助开发者统一的进行各种技术的版本管理。

注意parent定义出来以后,并不是直接使用,仅仅是给开发者一个说明书。

总结:继承spring-boot-starter-parent,其中定义了若干个依赖管理。继承parent模块可以避免多个依赖使用相同技术时出现依赖版本冲突。

  • 在pom.xml文件中,继承了一个spring-boot-starter-parent的坐标
    在这里插入图片描述

  • 打开后可以查阅到其中又继承了一个spring-boot-dependencies的坐标
    在这里插入图片描述

  • 打开 spring-boot-dependencies ,可以看到其 properties 下,列出了各式各样的依赖版本号属性,定义了若干个技术的依赖版本号。
    在这里插入图片描述

  • 而后的 dependencyManagement 中,列出了依赖坐标信息,其中依赖没有具体的依赖版本号,而是引用了上面定义的依赖版本属性值
    在这里插入图片描述

1.2 Starter

在实际开发时,对于依赖坐标的使用往往都有一些固定的组合方式,繁琐且格式固定,没有技术含量。由此SpringBoot提供了starter,定义了使用某种技术时对于依赖的固定搭配格式,一次配置就可引入一组依赖,使用starter可以帮助开发者减少依赖配置

命名规则:spring-boot-starter-技术名称

注意:

  1. starter是一个坐标中定了若干个坐标,以前写多个的,现在写一个,是用来减少依赖配置的书写量的
  2. parent是定义了几百个依赖版本号,以前写依赖需要自己手工控制版本,现在由SpringBoot统一管理,这样就不存在版本冲突了,是用来减少依赖冲突的
  • 在pom.xml文件中,引入 spring-boot-starter-web在这里插入图片描述
  • 打开 spring-boot-starter-web 后,可以看到其又定义了若干个具体依赖的坐标
    在这里插入图片描述

1.3 引导类

SpringBoot程序运行的入口就是工程创建时自带的,带有main方法的类,运行这个类就可以启动SpringBoot工程的运行。

package com.ty;import com.ty.controller.DemoController;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication
public class SpringbootDemoApplication {public static void main(String[] args) {SpringApplication.run(SpringbootDemoApplication.class, args);}
}

pringBoot本身是为了加速Spring程序的开发的,而Spring程序运行的基础是需要创建自己的Spring容器对象(IoC容器)并将所有的对象交给Spring的容器管理,也就是 Bean。当前SpringBoot启动类运行后就会产生一个Spring容器对象,通过容器对象直接操作Bean。

package com.ty;import com.ty.controller.DemoController;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication
public class SpringbootDemoApplication {public static void main(String[] args) {ConfigurableApplicationContext run = SpringApplication.run(SpringbootDemoApplication.class, args);DemoController bean = run.getBean(DemoController.class);System.out.println(bean);}
}

1.4 内嵌tomcat

1.4.1 定位tomcat
在 SpringBoot 中,引入了 spring-boot-starter-web ,当打开 spring-boot-starter-web 便能看到,又引入了 spring-boot-starter-tomcat ,再打开这个starter,其中的 tomcat-embed-core,叫做tomcat内嵌核心,便是这个奖tomcat功能引入到了我们SpringBoot项目中。

在这里插入图片描述
1.4.2 更换内嵌Tomcat

SpringBoot提供了3款内置的服务器

  • tomcat(默认):apache出品,粉丝多,应用面广,负载了若干较重的组件

  • jetty:更轻量级,负载性能远不及tomcat

  • undertow:负载性能勉强跑赢tomcat

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jetty</artifactId></dependency>
</dependencies>

总结

  1. 内嵌Tomcat服务器是SpringBoot辅助功能之一
  2. 内嵌Tomcat工作原理是将Tomcat服务器作为对象运行,并将该对象交给Spring容器管理
  3. 变更内嵌服务器思想是去除现有服务器,添加全新的服务器

2. SpringBoot基础配置

2.1 配置文件分类

SpringBoot支持的配置文件:

  • properties格式:

    server.port=80
    
  • yml格式:

    server:port: 81
    
  • yaml格式:

    server:port: 82
    

2.2 配置文件优先级

  1. 配置文件间的加载优先级 properties> yml > yaml
  2. 不同配置文件中相同配置按照加载优先级相互覆盖,不同配置文件中不同配置全部保留

2.3 读取配置数据

2.3.1 Environment 读取全部配置数据

  • application.yml 中配置:

    datasource:driver: com.mysql.jdbc.Dirverurl: jdbc:mysql://localhost/springboot_dbusername: rootpassword: 123
    
  • 直接通过自动装配注解,将配置文件中的配置数据封装到 Environment 对象中。

    package com.ty.controller;import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.core.env.Environment;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;@RestController
    @RequestMapping("/demo")
    public class DemoController {@Autowiredprivate Environment environment;@GetMappingpublic String getByIds(){String id = "TY Demo SpringBoot is Running...";System.out.println(id);System.out.println("Driver" + environment.getProperty("driver"));System.out.println("Url" + environment.getProperty("url"));System.out.println("Username" + environment.getProperty("username"));System.out.println("Password" + environment.getProperty("password"));return id;}
    }
    

2.3.2 @ConfigurationProperties 读取配置对象数据

SpringBoot 可将一组配置数据封装为一个Java对象。

  • application.yml 中配置:

    datasource:driver: com.mysql.jdbc.Dirverurl: jdbc:mysql://localhost/springboot_dbusername: rootpassword: 123
    
  • 首先定义一个配置参数封装类,使用注解 @ConfigurationProperties,指定对象加载的配置文件中的信息。@ConfigurationProperties 必须告诉他加载的数据前缀,这样当前前缀下的所有属性就封装到这个对象中。

    package com.ty;import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;@Component
    @Data
    @ConfigurationProperties(prefix = "datasource")
    public class MyDataSource {private String driver;private String url;private String username;private String password;@Overridepublic String toString() {return "MyDataSource{" +"driver='" + driver + '\'' +", url='" + url + '\'' +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
    }
    
  • 直接通过自动装配注解,引入 MyDataSource对象。

    package com.ty.controller;import com.ty.MyDataSource;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;@RestController
    @RequestMapping("/demo")
    public class DemoController {@Autowiredprivate Environment environment;@AutowiredMyDataSource myDataSource;@GetMappingpublic String getById() {String id = "TY Demo SpringBoot is Running...";System.out.println(id);System.out.println("Driver" + myDataSource.getDriver());System.out.println("Url" + myDataSource.getUrl());System.out.println("Username" + myDataSource.getUsername());System.out.println("Password" + myDataSource.getPassword());return id;}
    }

相关文章:

SpringBoot核心功能与基础配置

SpringBoot简介 原先的Spring程序缺点&#xff0c;包括依赖设置繁琐&#xff0c;每项jar的引用都需要自己撰写。并且配置繁琐&#xff0c;配置文件中也需要自己写加载bean等。由此针对原始的Spring程序&#xff0c;Pivotal团队提供的全新框架——SpringBoot&#xff0c;其设计…...

vue3后台管理框架之Mock开发

前言 在前后端对接中&#xff0c;有时后端的接口数据没有 那么快能给出&#xff0c;因此我们可以通过mock模拟自己的请求数据&#xff0c;在后端接口没有给出的同时&#xff0c;先使用mock请求的数据完成前端相关的逻辑 官方文档&#xff1a;vite-plugin-mock vite 的数据模…...

03_51单片机点亮LED灯

51单片机是一种非常常见的单片机型号&#xff0c;广泛应用于各种嵌入式系统和电子设备中。LED灯是一种常见的输出设备&#xff0c;用于显示信息或指示状态。下面是关于51单片机控制LED灯的介绍&#xff1a; 1. 连接LED灯&#xff1a;将LED的正极连接到51单片机的一个I/O引脚&a…...

【前端设计模式】之备忘录模式

备忘录模式是一种行为设计模式&#xff0c;它允许在不破坏封装性的前提下捕获和恢复对象的内部状态。在前端开发中&#xff0c;备忘录模式可以用于保存和恢复用户界面的状态&#xff0c;以及实现撤销和重做功能。 备忘录模式特性&#xff1a; 封装了对象的状态&#xff1a;备…...

复习Day15:栈与队列part02:20. 有效的括号、1047.删除字符串中所有相邻重复项

我用的方法是在leetcode再过一遍例题&#xff0c;明显会的就复制粘贴&#xff0c;之前没写出来就重写&#xff0c;然后从拓展题目中找题目来写。辅以Labuladong的文章看。然后刷题不用CLion了&#xff0c;使用leetcode自带的IDE模拟面试环境。 历史博客链接&#xff1a; http…...

基于Java的宠物商城管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…...

Python的GIL存在的情况下,是否还有必要添加线程锁。

GIL锁的产生&#xff1a; 为了保证在单线程情况下&#xff0c;Python的正常执行和效率&#xff0c;GIL锁产生了&#xff0c;由于只有一把锁就不会产生死锁也不用切换。 对于Python语言而言&#xff0c;只有CPython解释器&#xff08;用C语言编写的Python解释库&#xff09;存在…...

基于下垂控制的孤岛双机并联逆变器环流抑制MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 在实际应用中逆变器都是并联运行的,但是逆变器的并联运行也存在不少问题,由于线路阻抗差异、各个逆变器输出端瞬时电压幅值不同等,都容易导致环流的出现。环流会导致逆变器损耗增加,从而影响微电网的输出效率…...

spring事务面试题

1.Spring 事务实现方式有哪些&#xff1f; 事务就是一系列的操作原子操作,Spring事务机制主要 包括声明式事务和编程式事务。 编程式事务&#xff1a;通过编程的方式管理事务&#xff0c;自己设置未提交模式&#xff0c;自己获取连接&#xff0c;自己预编译&#xff0c;自己回…...

C++标准库算法整理

目录 1、数值操作 1.1、std::accumulate 1.2、std::inner_product 1.3、std::partial_sum 1.4、std::exclusive_scan 1.5、std::inclusive_scan 1.6、std::reduce 2、相邻元素 2.1、std::adjacent_difference 2.2、std::adjacent_find 2.3、std::unique 2.4、std::u…...

【Codeforces】Codeforces Round 903 (Div. 3)【待补】

Dashboard - Codeforces Round 903 (Div. 3) - Codeforces Problem - C - Codeforces Problem - D - Codeforces...

workerman 运行时报错 Call to undefined function posix_getpid()

使用 验证php扩展是否齐全 curl -Ss https://www.workerman.net/check | php缺少posix 下载 在 Linux 系统上&#xff0c;可以使用包管理器来安装 php-posix 扩展&#xff0c;例如 Ubuntu 系统可以通过以下命令进行安装&#xff1a; sudo apt-get install php-posix如果你使用…...

【探讨C++中的临时对象:一时之物还是永恒之道?】

在C编程中&#xff0c;临时对象是一个经常引起讨论的话题。它们是什么&#xff0c;为什么它们存在&#xff0c;以及如何正确使用它们&#xff1f;本文将深入探讨C中的临时对象&#xff0c;帮助您理解它们的含义和用途。 什么是临时对象&#xff1f; 临时对象&#xff08;Temp…...

二叉树相关算法

1、二叉树基本操作 二叉树的定义就不在这里多说了&#xff0c;下面这个图就是一个简单的二叉树&#xff1a; 二叉树的三种遍历方式&#xff1a; 前序遍历&#xff1a;头左右&#xff0c;也就是先头后左再右&#xff1a;1245367 public static void prePrint(BinaryTreeNode …...

Vue_Bug npm install报错 code:128

Bug描述&#xff1a; npm install报错 code&#xff1a;128 npm ERR! Warning: Permanently added ‘github.com’ (ED25519) to the list of known hosts. npm ERR! gitgithub.com: Permission denied (publickey). npm ERR! fatal: Could not read from remote repository. n…...

【Unity ShaderGraph】| 如何快速制作一个 马赛克效果 实战

前言 【Unity ShaderGraph】| 如何快速制作一个 马赛克效果 实战一、效果展示二、马赛克效果四、应用实例 前言 本文将使用Unity 的ShaderGraph制作一个马赛克的效果&#xff0c;可以直接拿到项目中使用。对ShaderGraph还不了解的小伙伴可以参考这篇文章&#xff1a;【Unity S…...

【Java 进阶篇】JavaScript DOM Document对象详解

在前端开发中&#xff0c;DOM&#xff08;文档对象模型&#xff09;扮演着重要的角色。它允许我们使用JavaScript来与网页文档进行交互&#xff0c;实现动态的网页效果。DOM的核心部分之一就是Document对象&#xff0c;它代表了整个HTML文档。在本篇博客中&#xff0c;我们将深…...

LetCode刷题[简单题](5)按摩师,迭代出最优解(卡尔曼滤波也是类似迭代)

所有的遍历寻求有条件约束的最大值都可以转换成&#xff0c;新的数带来的最大值的变化&#xff0c;问题往这个方向转化就可以&#xff0c;问题都是在最中进行选择的&#xff0c;因此关注的问题最大值得上限就好了&#xff0c;不必关注可能随机的下限。关注随机可能的下限会把问…...

C/C++笔试易错与高频题型图解知识点(二)—— C++部分(持续更新中)

目录 1.构造函数初始化列表 1.1 构造函数初始化列表与函数体内初始化区别 1.2 必须在初始化列表初始化的成员 2 引用&引用与指针的区别 2.1 引用初始化以后不能被改变&#xff0c;指针可以改变所指的对象 2.2 引用和指针的区别 3 构造函数与析构函数系列题 3.1构造函数与析…...

使用new创建动态结构

在运行时创建数组优于在编译时创建数组&#xff0c;对于结构&#xff08;同一个结构可以存储多种类型的数据。&#xff09;也是如此。需要在程序运行时为结构分配所需的空间&#xff0c;这也可以使用new运算符来完成。通过使用new&#xff0c;可以创建动态结构。同样&#xff0…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

stm32wle5 lpuart DMA数据不接收

配置波特率9600时&#xff0c;需要使用外部低速晶振...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...

机器学习的数学基础:线性模型

线性模型 线性模型的基本形式为&#xff1a; f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法&#xff0c;得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...

TCP/IP 网络编程 | 服务端 客户端的封装

设计模式 文章目录 设计模式一、socket.h 接口&#xff08;interface&#xff09;二、socket.cpp 实现&#xff08;implementation&#xff09;三、server.cpp 使用封装&#xff08;main 函数&#xff09;四、client.cpp 使用封装&#xff08;main 函数&#xff09;五、退出方法…...