Springboot入门篇

一、概述

Spring是一个开源框架,2003 年兴起的一个轻量级的Java 开发框架,作者Rod Johnson  。Spring是为了解决企业级应用开发的复杂性而创建的,简化开发。

1.1对比

对比一下 Spring 程序和 SpringBoot 程序。如下图

坐标
  • Spring 程序中的坐标需要自己编写,而且坐标非常多
  • SpringBoot 程序中的坐标是我们在创建工程时进行勾选自动生成的
web3.0 配置类
  • Spring 程序需要自己编写这个配置类。这个配置类大家之前编写过,肯定感觉很复杂
  • SpringBoot 程序不需要我们自己书写
配置类
  • Spring/SpringMVC 程序的配置类需要自己书写。而 SpringBoot 程序则不需要书写。

1.2文件解析

parent

1.开发SpringBoot程序要继承spring-boot-starter-parent

2.spring-boot-starter-parent中定义了若干个依赖管理

3.继承parent模块可以避免多个依赖使用相同技术时出现依赖版本冲突

4.继承parent的形式也可以采用引入依赖的形式实现效果

 <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>3.2.0</version>
  </parent>

点进去:(Ctrl+B) 

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>3.2.0</version>
  </parent>

 点进去:(Ctrl+B) 

<modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>3.2.0</version>
  </parent>

再点进去:(Ctrl+B)

会发现定义了很多版本控制以及依赖

starter

SpringBoot中常见项目名称,定义了当前项目使用的所有依赖坐标,以达到减少依赖配置的目的

1.开发springboot程序需要导入坐标时通常导入对应的starter

2.每个不同的starter根据功能不同,通常包含多个依赖坐标

3.使用starter可以实现快速配置的效果,达到简化配置的目的 

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

这个我们都知道,一般称为 SpringBoot框架web项目的起步依赖,那么为什么我们添加这个依赖之后,之前在SpringMVC中的一些依赖就不需要再添加了呢?点进入这个依赖看看。 

可以看到这个依赖中,还管理着其他依赖,其中就有tomcat、spring-webmvc这些,这不都是之前学SpringMVC需要配置tomcat以及其他依赖项吗?而spring-boot-starter-web这个起步依赖已经帮我们做好了,你就不需要再添加很多其他依赖了,是不是很方便呢?

向其中的pom文件添加依赖的时候,我们会发现,添加的很多依赖都是以 spring-boot-start-XXX 这样的形式,我当时就按照字面意思去理解:springboot-开始-XXX的依赖。

那么,我们现在说的规范一点:

spring-boot-start-XXX就是spring-boot的场景启动器。

  • spring-boot-starter-web:帮我们导入了web模块正常运行所依赖的组件;
  • spring-boot-starter-thymeleaf:帮我们导入了thymeleaf模板引擎正常运行所依赖的组件;

引导类

1.SpringBoot工程提供引导类用来启动程序

2.SpringBoot工程启动后创建并初始化Spring容器

package com.yanyu;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringTest1Application {

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

}

 SpringBoot的引导类是Boot工程的执行入口,运行main方法就可以启动项目

SpringBoot工程运行后初始化Spring容器,扫描引导类所在包加载bean

内嵌tomcat

内嵌tomcat(spring-boot-starter-web)

工作原理是将tomcat服务器作为对象运行,并将该对象交给Spring容器管理 

 <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
      <version>3.2.0</version>
      <scope>compile</scope>
    </dependency>

springboot内置服务器:

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

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

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

1.3快速启动

打包

  <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>

 所以我们只需要使用 Maven package 指令打包就会在 target 目录下生成对应的 Jar

启动

进入 jar 包所在位置,在 命令提示符 中输入如下命令
jar -jar springboot_01_quickstart-0.0.1-SNAPSHOT.jar 1
执行上述命令就可以看到 SpringBoot 运行的日志信息

1.4概述

SpringBoot程序优点:

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

SpringBoot的四大核心了:

  • 自动装配:简单配置甚至零配置即可运行项目
  • 起步依赖:场景启动器
  • Actuator:指标监控
  • 命令行界面 :命令行

 辅助功能

排除依赖

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

二、基础配置

2.1配置文件格式

SpringBoot使用一个全局的配置文件 , 配置文件名称是固定的

  • application.properties

    • 语法结构 :key=value

  • application.yml

    • 语法结构 :key:空格 value

  •  application.yaml

注意: SpringBoot 程序的配置文件名必须是 application ,只是后缀名不同而已。
优先级为:properties>yml>yaml

配置文件的作用 :修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了;

比如我们可以在配置文件中修改Tomcat 默认启动的端口号!测试一下!


server.port=8081

2.2配置文件历史

xml

xml ,格式如下:
<enterprise>
<name>itcast</name>
<age>16</age>
<tel>4006184000</tel>
</enterprise>

properties

properties 类型的配置文件如下
enterprise.name=itcast
enterprise.age=16
enterprise.tel=4006184000

yaml 类型

yaml 类型的配置文件内容如下
enterprise:
    name: itcast
    age: 16
    tel: 4006184000
    

2.3yaml格式

YAML YAML Ain't Markup Language ),一种数据序列化格式。这种格式的配置文件在近些年已经占有主导地位,。

优点:

        容易阅读

        容易与脚本语言交互

        以数据为核心,重数据轻格式 

yml语法规则

①大小写敏感

②属性层级关系使用多行描述,每行结尾时用冒号结束

③属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)

④#表示注释

⑤使用缩进标识层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)

 

读取yaml数据

读取yaml单一属性数据

使用@Value配合SpEL读取单个数据

如果数据存在多层级,依次书写层级名称即可

lesson: SpringBoot
server:
port: 80
enterprise:
    name: itcast
    age: 16
    tel: 4006184000
    subject:
        - Java
        - 前端
        - 大数据
@RestController
@RequestMapping("/books")
public class BookController {
    @Value("${lesson}")
    private String lesson;
    @Value("${server.port}")
    private Integer port;
    @Value("${enterprise.subject[0]}")
    private String subject_00;
    
    @GetMapping("/{id}")
    public String getById(@PathVariable Integer id){
        System.out.println(lesson);
        System.out.println(port);
        System.out.println(subject_00);
        return "hello , spring boot!";
    }
}
Environment对象
上面方式读取到的数据特别零散, SpringBoot 还可以使用 @Autowired 注解注入 Environment 对象的方式读取数据。这 种方式 SpringBoot 会将配置文件中所有的数据封装到 Environment 对象中,如果需要使用哪个数据只需要通过调用
Environment 对象的 getProperty(String name) 方法获取。具体代码如下:
 读取yaml引用类型属性数据

1.使用@ConfigurationProperties注解绑定配置信息到封装类中

2.封装类需要定义为Spring管理的bean,否则无法进行属性注入

 

注意:这种方式,框架内容大量数据,而在开发中我们很少使用。

 举例

配置

#创建类,用于封装下面的数据
#由spring帮我们去加载数据到对象中,一定要告诉spring加载这组信息
#使用的时候从spring中直接获取信息使用
 
datasource:
  driver: com.myswl.cj.jdbc.Driver
  url: jdbc:mysql://localhost/db_springboot
  username: root
  password: root

自定义环境类

package com.yanyu.pojo;


import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

//1.定义数据模型封装yaml文件中对应的数据
//2.定义为spring管控的bean
@Component
//3.指定加载的数据
@ConfigurationProperties(prefix="datasource")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class MyDataSource {
    private String driver;
    private String url;
    private String username;
    private String password;


}

测试

package com.yanyu.controller;

import com.yanyu.pojo.MyDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/books")
public class BookController {

    @Autowired
    private MyDataSource myDataSource;

    @GetMapping("/datasource")
    public String getMyDatasource(){
        System.out.println(myDataSource);
        return "source";
    }
}
GET http://localhost:8080/books/datasource

自定义对象封装数据警告解决方案
这个警告提示解决是在 pom.xml 中添加如下依赖即可

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

读取Property数据

加载指定的配置文件

@PropertySource :加载指定的配置文件;

@configurationProperties:默认从全局配置文件中获取值;

配置文件占位符

配置文件还可以编写占位符生成随机数

person:
    name: qinjiang${random.uuid} # 随机uuid
    age: ${random.int}  # 随机int
    happy: false
    birth: 2000/01/01
    maps: {k1: v1,k2: v2}
    lists:
      - code
      - girl
      - music
    dog:
      name: ${person.hello:other}_旺财
      age: 1

1、新建一个实体类User


@Component //注册bean
public class User {
    private String name;
    private int age;
    private String sex;
}

2、编辑配置文件 user.properties

user1.name=kuangshen
user1.age=18
user1.sex=男

3、我们在User类上使用@Value来进行注入!


@Component //注册bean
@PropertySource(value = "classpath:user.properties")
public class User {
    //直接使用@value
    @Value("${user.name}") //从配置文件中取值
    private String name;
    @Value("#{9*2}")  // #{SPEL} Spring表达式
    private int age;
    @Value("男")  // 字面量
    private String sex;
}

 4、Springboot测试


@SpringBootTest
class DemoApplicationTests {

    @Autowired
    User user;

    @Test
    public void contextLoads() {
        System.out.println(user);
    }

}

三、多环境配置

 yaml 类型

#设置启用的环境
spring:
profiles:
active: dev
---
#开发
spring:
profiles: dev
server:
port: 80
---
#生产
spring:
profiles: pro
server:
port: 81
---
#测试
spring:
profiles: test
server:
port: 82
注意:
在上面配置中给不同配置起名字的 spring.profiles 配置项已经过时。最新用来起名字的配置项是
#开发
spring:
config:
activate:
on-profile: dev

properties文件

 命令行启动参数设置

使用 SpringBoot 开发的程序以后都是打成 jar 包,通过 java - jar xxx.jar 的方式启动服务的。那么就存在一个问 题,如何切换环境呢?因为配置文件打到的jar 包中了。
我们知道 jar 包其实就是一个压缩包,可以解压缩,然后修改配置,最后再打成 jar 包就可以了。这种方式显然有点麻烦, 而 SpringBoot 提供了在运行 jar 时设置开启指定的环境的方式,如下
java –jar xxx.jar –-spring.profiles.active=test
那么这种方式能不能临时修改端口号呢?也是可以的,可以通过如下方式
java –jar xxx.jar –-server.port=88 
当然也可以同时设置多个配置,比如即指定启用哪个环境配置,又临时指定端口,如下
java –jar springboot.jar –-server.port=88 –-spring.profiles.active=test

配置文件分类

SpringBoot 4 级配置文件放置位置:
  • 1级:classpathapplication.yml
  • 2级:classpathconfig/application.yml
  • 3级:file :application.yml
  • 4级:file config/application.yml
说明: 级别越高优先级越高

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

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

相关文章

【华为数据之道学习笔记】3-11元数据管理

1. 产生元数据 &#xff08;1&#xff09;明确业务元数据、技术元数据和操作元数据之间的关系&#xff0c;定义华为公司元数据模型。 &#xff08;2&#xff09;针对找数据及获取数据难的痛点&#xff0c;明确业务元数据、技术元数据、操作元数据的设计原则。 1&#xff09;业务…

Pytorch-LSTM轴承故障一维信号分类(一)

目录 前言 1 数据集制作与加载 1.1 导入数据 第一步&#xff0c;导入十分类数据 第二步&#xff0c;读取MAT文件驱动端数据 第三步&#xff0c;制作数据集 第四步&#xff0c;制作训练集和标签 1.2 数据加载&#xff0c;训练数据、测试数据分组&#xff0c;数据分batch…

C++之STL算法(1)

STL容器算法主要由、、组成&#xff1b;   algorithm主要有遍历、比较、交换、查找、拷贝、修改等&#xff1b; 1.遍历容器for_each for_each()函数用于完成容器遍历&#xff0c;函数参数如下&#xff1a; for_each(_InIt _First, _InIt _Last, _Fn _Func) 形参&#xff1a…

mybatis多表映射-延迟加载,延迟加载的前提条件是:分步查询

1、建库建表 create database mybatis-example; use mybatis-example; create table t_book (bid varchar(20) primary key,bname varchar(20),stuid varchar(20) ); insert into t_book values(b001,Java,s001); insert into t_book values(b002,Python,s002); insert into …

基于 librosa和soundfile对音频进行重采样 (VITS 必备)

基于 librosa和soundfile对音频进行重采样 一、前言 在玩bert-vits2的时候有对音频进行重采样的需求&#xff0c;故写了一下批量对音频进行重采样的脚本。 优化点&#xff1a; 根据机器自适应线程数为最多&#xff0c;保证充分利用机器资源&#xff0c;提高速度>30%。支持…

UE引擎 LandscapeGrass 实现机制分析(UE5.2)

前言 随着电脑和手机硬件性能越来越高&#xff0c;游戏越来越追求大世界&#xff0c;而大世界非常核心的一环是植被&#xff0c;目前UE5引擎提供给植被生成的主流两种方式为 手刷植被和LandscapeGrass(WeightMap程序化植被)。当然UE5.3推出新一代PCGFramework 节点程序化生成框…

Android 顶部对齐宽度撑满高度等比例缩放及限制最大最小高度

一 示例 二 代码 <?xml version"1.0" encoding"utf-8"?> <FrameLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent&qu…

点评项目——秒杀优化

2023.12.11 上一张的秒杀券下单还可以进行优化&#xff0c;先来回顾一下下单流程&#xff1a; 可以看出流程设计多次查询和操作数据库的操作&#xff0c;并且执行顺序是一个线程串行执行&#xff0c;执行性能是比较低的。 优化方案&#xff1a;我们将判断秒杀库存和校验一人一单…

蓝桥杯周赛 第 1 场 强者挑战赛 6. 小球碰撞【算法赛】(思维题/最长上升子序列LIS)

题目 https://www.lanqiao.cn/problems/9494/learning/?contest_id153 思路来源 Aging代码 题解 二分时间t&#xff0c;第i个小球对应一个起点pi、终点pit*vi的区间&#xff0c;问题转化为&#xff0c; 选最多的区间&#xff0c;使得不存在区间包含&#xff08;即li<l…

第二百零一回 介绍一个三方包open_settings

文章目录 1. 概念介绍2 使用方法3 代码与效果3.1 示例代码3.2 运行效果 4. 经验分享 我们在上一章回中介绍了Form Widget相关的内容&#xff0c;本章回中将介绍Form系列组件的验证与提交功能.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在这里说的的验…

【电路笔记】-电位器

电位器 文章目录 电位器1、概述2、电位器类型2.1 旋转电位器2.2 滑块电位器2.3 预设和微调电位器2.4 变阻器 3、电位器示例14、电位器作为分压器5、电位器示例26、变阻器6、滑块变阻器7、线性或对数电位器8、总结 当连接的轴物理旋转时&#xff0c;电位计和变阻器的电阻值会发生…

23种设计模式之装饰者模式(被装饰者,接口层,装饰抽象层,具体装饰者)

23种设计模式之装饰者模式 文章目录 23种设计模式之装饰者模式设计思想装饰者模式的优点装饰者模式的缺点装饰者模式的优化方法UML 解析预设场景 代码释义总结 设计思想 原文:装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0…

【EMNLP 2023】面向垂直领域的知识预训练语言模型

近日&#xff0c;阿里云人工智能平台PAI与华东师范大学数据科学与工程学院合作在自然语言处理顶级会议EMNLP2023上发表基于双曲空间和对比学习的垂直领域预训练语言模型。通过比较垂直领域和开放领域知识图谱数据结构的不同特性&#xff0c;发现在垂直领域的图谱结构具有全局稀…

做数据分析为何要学统计学(3)——何为置信区间?它有什么作用?

置信区间是统计学中的一个重要工具&#xff0c;用以使用样本参数()来估计总体均值在某置信水平下的范围。通俗一点讲&#xff0c;如果置信度为95%&#xff08;等价于显著水平a0.05&#xff09;&#xff0c;置信区间为[a,b]&#xff0c;这就意味着总体均值落入该区间的概率为95%…

虹科Pico汽车示波器 | 汽车免拆检修 | 2019款别克GL8豪华商务车前照灯水平调节故障

一、故障现象 一辆2019款别克GL8豪华商务车&#xff0c;搭载LTG发动机&#xff0c;累计行驶里程约为10.7万km。车主反映&#xff0c;车辆行驶过程中组合仪表提示前照灯水平调节故障。 二、故障诊断 接车后试车&#xff0c;起动发动机&#xff0c;组合仪表上提示“前照灯水平调节…

Spring Boot监听redis过期的key

Redis支持过期监听&#xff0c;可以实现监听过期数据&#xff0c;实现过程如下 1、pom依赖 <!-- Redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></depend…

ChatGPT/GPT4应用:文本、论文、编程、绘图等,提高工作效率及科研项目开发能力

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

深入理解模板引擎:解锁 Web 开发的新境界(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Android蓝牙协议栈fluoride(五) - 设备管理(bt application)

在上一篇Android蓝牙协议栈fluoride(四) - 设备管理(bt interface) 中梳理了设备管理器对上层提供的接口&#xff0c;本文将介绍这些接口的具体实现。 各个模块中采用了API状态机数据收发的方式&#xff0c;介绍设备管理时也将采用这个顺序介绍。 核心数据结构 设备管理的核…

鸿蒙HarmonyOS4.0 入门与实战

一、开发准备: 熟悉鸿蒙官网安装DevEco Studio熟悉鸿蒙官网 HarmonyOS应用开发官网 - 华为HarmonyOS打造全场景新服务 应用设计相关资源: 开发相关资源: 例如开发工具 DevEco Studio 的下载 应用发布: 开发文档: