SpringBoot(一)【入门】

前言

1、SpringBoot 快速入门

1.1、SpringBoot 简介

  • SpringBoot 是用来简化 Spring 应用的初始搭建以及开发过程

首先我们回顾一下 SpringMVC 项目的开发过程:

  1. 导入依赖(javax.servlet-api 和 spring-webmvc)
  2. Servlet 容器配置类(在这里设置 SpringMVC 来处理所有请求)
  3. SpringMVC 容器配置类
  4. 创建 Controller 类

1.2、SpringBoot 项目创建的两种方式

1.2.1、手动创建

这里我们不再是创建 Maven 工程了,而是创建一个 Spring Initialzr 项目:

然后选择 SpringBoot 版本并勾选 SpringbWeb: 

创建好工程后,我们只需要保留 src 目录和 pom.xml,别的文件都可以删了。

SpringBoot 程序并不需要像开发 SpringMVC 程序那样一上来先创建 ServletConfig、SpringMvcConfig 这些配置类,我们只需要写一个 Controller 类:

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

    @GetMapping("/{id}")
    public String getById(@PathVariable Integer id){
        System.out.println("id => " + id);
        return "hello springboot";
    }

}

接着写一个执行类:

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

不用配置 Tomcat 直接执行,然后访问 local:8080/books/1

查看控制台输出: 

恐怖如斯!!!我们啥都没干,就写了一个 Controller 类!!!

1.2.2、Spring 官网创建

打开 start.spring.io

下载项目之后,我们查看 pom.xml:

可以看到,和我们在 Idea 创建的项目 pom.xml 中的核心依赖是一样的,只不过这里的 SpringBoot 版本最低就是 3.2.4 ,JDK 版本必须 JDK17+。

1.3、SpringBoot 快速启动

        SpringBoot 程序可以不依赖 Tomcat 和 Idea 直接运行,但是数据库必须得有。所以前后端开发 Web 程序的过程中,后端程序员只需要给前端程序媛一个 jar 包和数据库建表语句即可。

打包 SpringBoot 项目:

重点是要有这个打包插件:

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <addResources>true</addResources>
                    <mainClass>com.lyh.Application</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

在 idea 用 package 打包程序,在 jar 包目录输入 cmd 使用 java -jar 命令执行并在浏览器访问 localhost:8080/books/1 :

这样我们的项目就可以摆脱对 Idea 和 Tomcat 的依赖随处运行了。

1.4、起步依赖

        为什么 SpringBoot 可以帮我自动处理好依赖之间的关系,而使得我们几乎不需要自己导入任何依赖呢,这其实主要归功于它帮我把所有的依赖都导进来了:

SpringBoot 的三个核心依赖:

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

 我们可以打开查看一下:

        可以看到,光是一个 spring-boot-dependencies 中帮我们管理了接近两百个依赖,而下面的 spring-boot-starter-web 和 spring-boot-starter-test 同样帮我们导入了 tomcat、servlet、springmvc 等依赖。

        所以 SpringBoot 的起步依赖通过帮我们来管理依赖,已达到减少依赖冲突的目的。

1.5、切换 Web 服务器

        上面我们打包的 SpringBoot 程序会内置一个 tomcat,所以我们可以在别的地方运行,这是因为  spring-boot-starter-web 帮我们导入了 tomcat 的依赖,但是如果我们不希望使用 tomcat 又该怎么办?tomcat 是内置的依赖,我们怎么排除掉?

    <!-- 排除tomcat依赖-->
    <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>
    <!-- 导入jetty依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jetty</artifactId>
            <version>2.5.0</version>
        </dependency>

 启动项目:

        所以,之后当遇到版本依赖需要替换依赖的情况我们都可以这么干!相比较 Tomcat,Jetty 更加轻量级,可扩展性更强。

2、基础配置

2.1、配置文件格式(3种)

2.1.1、修改服务器端口

        现在我们启动的项目端口默认就是 8080,那如果我们要修改的话,就需要进行配置。

  • applicantion.properties
server.port=80
  • 创建一个 application.yml (SpringBoot 项目中我们的配置文件都用 application.x 的格式)
server:
  port: 80

注意:port: 和 80 之间一定要有空格

  • 创建一个 application.yaml(相比较 application.yml  只是扩展名不同,内容都一样)
server:
  port: 80

Idea 设置 SpringBoot 配置文件提示功能:

我们之后写 application.yml 更多一些,如果三个文件都存在,则优先级: application.properties  >  application.yml >  application.yaml

2.1.2、yaml

  • YAML (Ain't Markup Language),一种数据序列化格式
  • 优点:
    • 容易阅读
    • 容易与脚本语言交互
    • 以数据为核心,重数据轻格式
  • YAML 扩展名
    • .yml(主流)
    • .yaml

语法规则

  • 大小写敏感
  • 属性层级关系使用多行描述,每行结尾用冒号结束
  • 使用缩进表示属性层级关系,同层级左侧对齐,只允许使用空格(不允许 Tab 键)
  • 属性值前面必须添加空格
  • # 表示注释
  • 数组数据使用 '-' 表示开始 

2.1.3、yaml 数据读取方式(3种)

先在 application.yml 中添加下面的内容 

student:
  name: tom
  age: 15
  subject:
    - Math
    - English
    - Chinese
(1)@Value (直接读取)
    @Value("${student}")
    private String student;
    @Value("${server.port}")
    private Integer port;
    @Value("${student.subject[0]}")
    private String subject0;
(2)Environment (封装后读取)
    @Autowired
    private Environment environment;
    
    // 用的时候直接调用
    System.out.println(environment.getProperty("server.port"));
    System.out.println(environment.getProperty("student.subject[0]"));
(3)实体类封装(常用)

        在 domain 包下创建一个 Student 对象,这个对象必须被 SpringBoot 管理,所以使用 @Component 注解来标识;而且这里需要指定配置名称,所以用 @ConfigurationProperties 来表示属性名:

@Component
@ConfigurationProperties(prefix = "student")
public class Student {
    private String name;
    private Integer age;
    private String[] subject;

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", subject=" + Arrays.toString(subject) +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String[] getSubject() {
        return subject;
    }

    public void setSubject(String[] subject) {
        this.subject = subject;
    }
}

用的时候直接用 student 对象的 get 方法即可。

    @Autowired
    private Student student;

    // 用的时候调用get方法
    System.out.println(student.getAge());

包括之后我们配置 Mybatis 也会通过这种方式来配置。

如果遇到对象封装警告,需要导入 Maven 依赖:

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

2.2、多环境开发

 在不同的环境下我们往往使用的配置不同,那我们应该怎么设置?

 2.2.1、yaml 文件多环境启动 

通过 "---" 来区分不同的环境,通过 spring: profiles: active 来指定我们上线时使用的环境信息:

spring:
  profiles:
    active: dev

---
# 开发环境
spring:
  profiles: dev
server:
  port: 85


---
# 生产环境
spring:
  profiles: pro
server:
  port: 86

---
# 测试环境
spring:
  profiles: test
server:
  port: 87

这里的配置过时了,我们也可以换用这种格式:

spring:
  config:
    activate:
      on-profile: dev
server:
  port: 85

2.2.2、application.properties 文件多环境启动

spring.config.activate.on-profile=dev

创建 application-dev.properties:

server.port=85

创建 application-dev.properties:

server.port=85

 2.2.3、多环境启动命令格式

        在实际开发过程中,我们的程序打包后总是有一个我们指定的环境(比如我们这里的yml文件:spirng.profiles.active: dev)

打包程序(先设置编码格式,防止 SpringBoot 中的配置文件中文乱码,即使是中文注释):

如果打包后的 jar 包只有几 KB,那指定是打包出问题了,看看 pom.xml 中的这里:

测试结果:

普通启动:

我们看到,启动的端口是 85,我们现在指定环境为 test:

java -jar springboot-demo1-0.0.1-SNAPSHOT.jar --spring.profiles.active=test

可以看到,端口被切换为 87 

2.2.4、多环境开发兼容性问题

        在 SpringBoot 和 Maven 都有 profile 配置的情况下,SpringBoot 的配置应该听从于 Maven ,也就是说 Maven 应该占据主导地位。

Maven 中设置多环境属性

    <profiles>
        <!-- 开发环境 -->
        <profile>
            <id>dev</id>
            <properties>
                <profile.active>dev</profile.active>
            </properties>
        </profile>
        <!-- 生产环境 -->
        <profile>
            <id>pro</id>
            <properties>
                <profile.active>pro</profile.active>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <!-- 测试环境 -->
        <profile>
            <id>test</id>
            <properties>
                <profile.active>test</profile.active>
            </properties>
        </profile>
    </profiles>

SpringBoot 中引用 Maven 属性

spring:
  profiles:
    active: ${profile.active}

对资源文件开启默认占位符的解析

这里需要引入一个插件来将我们 Maven 中配置的<profile.active>属性值加载到 application.yml 中的占位符 ${profile.active} 当中:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>3.2.0</version>
    <configuration>
        <encoding>UTF-8</encoding>
        <useDefaultDelimiters>true</useDefaultDelimiters>
    </configuration>
</plugin>

未导入插件前:

导入插件后,我们解压打包好的 jar 包后就会发现Maven中的属性值被成功加载到 application.yml:

2.3、配置文件分类

  • SpringBoot 中4级配置文件等级(从高到低)
    • 1级:config/application.yml(jar包所在目录下的config目录)
    • 2级:application.yml(jar包所在目录)
    • 3级:classpath: config/application.yml(jar包内的路径/Maven工程的resources目录下的config目录)
    • 4级:classpath: application.yml(jar包内的路径/Maven工程的resources目录)

所以,如果我们测试的时候希望修改某个配置属性,可以通过前两种方式对属性进行覆盖。

编辑一个 application.yml:

server:
  port: 88

 放到 jar 包所在目录

测试: 

可以看到,jar 包内的配置端口=85 被覆盖掉了。

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

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

相关文章

VirtualBox虚拟机使用win11系统,忘记密码如何重置密码

1. 点击重启同时按住Shift&#xff08;按住不放&#xff09; 2. 直到出现下面的界面&#xff0c;释放Shift&#xff0c;并进入疑难解答 3. 进入高级选项 4. 进入命令提示符 5. 发现当前是在X盘&#xff1f; 6. 进入C:\Windows\System32 c: cd Windows\System32 7. 备份osk.exe…

SpringCloud系列(5)--SpringCloud微服务工程公共部分提取

前言&#xff1a;在上一章节中我们创建了两个个SpringCloud工程&#xff0c;但在两个工程中分别存在着一些重复的部分&#xff0c;例如重复的实体类&#xff08;如图所示&#xff09;&#xff0c;这样会造成系统的冗余&#xff0c;所以我们需要把公共的类提取到一个工程里&…

预约小程序新选择:强大后端管理功能一览

拥有一个功能齐全、操作便捷的小程序对于商家来说至关重要。为了满足广大商家的需求&#xff0c;乔拓云平台提供了丰富的模板资源&#xff0c;帮助用户快速搭建预约型小程序&#xff0c;并配备了强大的后端管理功能&#xff0c;让商家能够轻松管理预约订单&#xff0c;提升运营…

Centos7 ElasticSearch集群搭建

1. 服务器环境配置 1.1 配置hosts文件 3台服务器都要执行 vim /etc/hosts; # 将以下内容写入3台服务器hosts文件 192.168.226.148 es001 192.168.226.149 es002 192.168.226.150 es003 1.2 关闭防火墙 3台服务器都要执行 systemctl stop firewalld; systemctl disable…

【opencv】dnn示例-speech_recognition.cpp 使用DNN模块结合音频信号处理技术实现的英文语音识别...

模型下载地址&#xff1a; https://drive.google.com/drive/folders/1wLtxyao4ItAg8tt4Sb63zt6qXzhcQoR6 终端输出&#xff1a;&#xff08;audio6.mp3 、audio10.mp3&#xff09; [ERROR:00.002] global cap_ffmpeg_impl.hpp:1112 open VIDEOIO/FFMPEG: unsupported parameter…

# 从浅入深 学习 SpringCloud 微服务架构(一)基础知识

从浅入深 学习 SpringCloud 微服务架构&#xff08;一&#xff09;基础知识 1、系统架构演变&#xff1a; 1&#xff09;单体应用架构。如电商项目。 用户管理、商品管理、订单管理&#xff0c;在一个模块里。 优点&#xff1a;开发简单&#xff0c;快速&#xff0c;适用于…

Mac下brew安装php7.4

这里作者挂了梯子&#xff0c;所以很流畅&#xff01; brew的下载&#xff0c;可参考另外一篇博文&#xff5e;Homebrew 安装与卸载 1、将第三方仓库加入brew brew tap shivammathur/php2、安装指定版本的PHP brew install php7.43、替换Mac自带PHP环境并刷新环境变量 -> …

基于simulink的模拟锁相环和数字锁相环建模与对比仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 模拟锁相环&#xff08;PLL&#xff09;的基本原理 4.2 数字锁相环&#xff08;DPLL&#xff09;的基本原理 5.完整工程文件 1.课题概述 模拟锁相环和数字锁相环建模的simulink建模&#xff0c;对…

OpenHarmony UI动画-recyclerview_animators

简介 带有添加删除动画效果以及整体动画效果的list组件库 下载安装 ohpm install ohos/recyclerview-animatorsOpenHarmony ohpm 环境配置等更多内容&#xff0c;请参考如何安装OpenHarmony ohpm 包 使用说明 引入组件库 import { RecyclerView } from "ohos/recycler…

Qt/C++音视频开发70-无感切换通道/无缝切换播放视频/多通道流畅切换/不同视频打开无缝切换

一、前言 之前就写过这个方案&#xff0c;当时做的是ffmpeg内核版本&#xff0c;由于ffmpeg内核解析都是代码实现&#xff0c;所以无缝切换非常完美&#xff0c;看不到丝毫的中间切换过程&#xff0c;看起来就像是在一个通道画面中。其实这种切换只能说是取巧办法&#xff0c;…

排序算法之计数排序

目录 一、简介二、代码实现三、应用场景 一、简介 算法平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度排序方式稳定性计数排序O(nk )O(nk)O(nk)O(k)Out-place稳定 稳定&#xff1a;如果A原本在B前面&#xff0c;而AB&#xff0c;排序之后A仍然在B的前面&#xff1b; 不…

稀碎从零算法笔记Day52-LeetCode:从双倍数组中还原原数组

题型&#xff1a;数组、贪心 链接&#xff1a;2007. 从双倍数组中还原原数组 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 一个整数数组 original 可以转变成一个 双倍 数组 changed &#xff0c;转变方式为将 original 中每个元素 值乘以 …

记录ubuntu20.04安装nvidia-525.85.05显卡驱动(学习笔记2024.4.15、4.16)

电脑&#xff1a;华硕天选X2024 显卡&#xff1a;4060Ti i5-14400F 架构&#xff1a;x86_64 我需要使用Linux系统使用IsaacSim进行仿真&#xff0c;所以安装的都是IsaacSim中的推荐版本。 一.对新鲜的电脑进行分盘 电脑刚到手&#xff0c;900多个G全在C盘里&#xff0c;给它…

学习笔记(4月18日)vector底层模拟实现(1)

1.迭代器 vector实际上是由迭代器进行维护的&#xff0c;关于迭代器是什么&#xff0c;为什么要叫这个名字&#xff0c;后面的学习会逐渐了解&#xff0c;现在先将迭代器是作为指针即可。 vector底层有三个迭代器&#xff0c;用来起到容量、数组头、元素个数的作用。 同时为…

数字零售力航母-看微软如何重塑媒体

数字零售力航母-看微软如何重塑媒体 - 从2024全美广播协会展会看微软如何整合营销媒体AI技术和AI平台公司 2024年&#xff0c;微软公司联合英伟达总司&#xff0c;赞助全美广播协会展会。本次展会微软通过搭建一个由全面的合作伙伴生态系统支持的可信和安全的平台&#xff0c;…

RIP最短路实验(华为)

思科设备参考&#xff1a;RIP最短路实验&#xff08;思科&#xff09; 一&#xff0c;技术简介 RIP&#xff08;Routing Information Protocol&#xff0c;路由信息协议&#xff09;是一种基于距离矢量的内部网关协议&#xff0c;工作原理是每个路由器周期性地向邻居路由器发…

【网站项目】新生报到系统小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Spring Boot | Spring Boot “缓存管理“

目录: 一、Spring Boot 默认 "缓存" 管理 :1.1 基础环境搭建① 准备数据② 创建项目③ 编写 "数据库表" 对应的 "实体类"④ 编写 "操作数据库" 的 Repository接口文件⑤ 编写 "业务操作列" Service文件⑥ 编写 "applic…

Vue2进阶之Vue2高级用法

Vue2高级用法 mixin示例一示例二 plugin插件自定义指令vue-element-admin slot插槽filter过滤器 mixin 示例一 App.vue <template><div id"app"></div> </template><script> const mixin2{created(){console.log("mixin creat…

美团财务科技后端一面:如何保证数据一致性?延时双删第二次失败如何解决?

更多大厂面试内容可见 -> http://11come.cn 美团财务科技后端一面&#xff1a;项目内容拷打 美团财务科技后端一面&#xff1a;项目相关面试题&#xff0c;主要包含 Zset、延时双删失败重试、热点数据解决、ThreadLocal 这几个方面相关的内容 由于前几个问题是对个人项目的…