SpringBoot(一)【入门】

news2024/11/15 11:38:06

前言

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 被覆盖掉了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pytest精通指南(14)Parametrize之indirect(间接参数)

文章目录 官方概念概念分析官方示例示例分析验证indirect为True但不指定fixture验证indirect为True但不存在fixture 官方概念 概念分析 在pytest的pytest.mark.parametrize装饰器中&#xff0c;indirect参数用于指示是否应该从fixtures中解析参数值&#xff0c;而不是直接使用提…

爆炸之linux-nacos2.0系列集群安装部署

一、环境配置 1、新建磁盘分区 fdisk /dev/vdb 2、创建文件系统 mkfs.xfs /dev/vdb13、创建挂载点&#xff1a; 在 / 目录下创建一个新的目录作为挂载点。/afc 目录 mkdir /afc4、挂载磁盘&#xff1a; 使用 mount 命令将磁盘挂载到新创建的目录。 mount /dev/vdb /afc5、…

Yoshua Bengio独家专访:我不想把大模型未来押注在Scaling Law上,AGI路上要“注意安全”...

导读 漫长的30年间&#xff0c;数度从主流方向的超然出走&#xff0c;是Bengio的制胜秘诀。这种不盲从主流的风格体现在他研究生涯的方方面面。 90年代末期&#xff0c;神经网络被打入冷宫&#xff0c;Bengio的论文多次遭拒&#xff0c;连学生们也开始担心&#xff0c;和他一起…

Vue之v-on事件修饰符的含义及使用

背景&#xff1a;Vue 拆封了一个组件&#xff0c;在组件里面会使用一个方法来改变父组件传过来的值&#xff0c; 但是在子组件里面操作父组件的数据变更&#xff0c;实在比较麻烦&#xff08;因为单向数据流&#xff09;&#xff0c; So 能不能直接在组件上面绑定事件方法呢&…

springSecurity-记住我(Remember me)

一.记住我概述 Remember me(记住我)记住我&#xff0c;当用户发起登录勾选了记住我&#xff0c;在一定的时间内再次登录就不用输入用户名和密码了&#xff0c;即使浏览器退出重新打开也是如此。 二.流程分析 在SpringSecurity中提供RememberMeAuthenticationFilter过滤器来实…

实时动作检测 | 基于Pytorch+YOLOv5+SlowFast实现的视频流实时动作检测算法_支持多目标的跟踪检测

项目应用场景 面向视频流场景的多目标实时动作检测&#xff0c;项目使用 Pytorch YOLOv5 SlowFast 算法实现。 项目效果 项目细节 > 具体参见项目 README.md (1) 创建 Python 开发环境 conda create -n {your_env_name} python3.7.11 conda activate {your_env_name} (2…

npm镜像源的查看和切换

前言 原域名https://registry.npm.taobao.org/ 原来的淘宝镜像已经不行了,当npm去taobao时,会出现一个证书过期的提示. 下面的是最新的地址: 切换到淘宝镜像(最新的地址) #最新地址 淘宝 NPM 镜像站喊你切换新域名啦! npm config set registry https://registry.npmmirror.com…

00_Linux

文章目录 LinuxLinux操作系统的组成Linux的文件系统Linux操作系统中的文件类型Linux操作系统的组织结构 Linux vs WindowsNAT vs 桥接模式 vs 仅主机Linux Shell命令Linux⽂件与⽬录管理相关指令目录文件普通文件文本编辑 用户管理添加用户删除用户用户组管理 文件权限管理权限…

视频教程下载:用ChatGPT快速提升股票投资能力

学完此视频后可以获得&#xff1a; 学习如何使用人工智能/Chatgpt进行基础/快速/高级财务与研究分析 学习如何使用人工智能/Chatgpt对任何公司进行定性投资研究 学习如何使用人工智能/Chatgpt对任何公司进行定量投资研究 学习如何使用人工智能/Chatgpt创建、预测和分析财务…

C语言(二维数组)

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

Mac下brew安装php7.4

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

【uniapp】uniapp返回上一页,并实现刷新界面数据

在uniapp中&#xff0c;经常会有返回上一页的情况&#xff0c;官方提供有 uni.navigateBack 这个api来实现效果&#xff0c;但是此方法返回到上一页之后页面并不会自动刷新&#xff08;不会触发上一页的onLoad()方法&#xff09;。 使用场景 从一个列表界面点击新增按钮&…

ASP.NET基于Web Mail收发系统设计与开发

摘 要 互联网络技术的不断发展&#xff0c;电子邮件服务已经成为人们基本的信息交互手段&#xff0c;也是网络服务中最早和最基本的服务之一。传统邮件系统大多是基于C/S结构&#xff0c;如Lotus notes、Microsoft Exchange Server等&#xff0c;这些邮件系统占用相对较多的服…

【氮化镓】GaN HEMT失效物理和可靠性

概述: 本文是一篇关于AlGaN/GaN基高电子迁移率晶体管(HEMTs)的失效物理和可靠性研究的综述文章,发表在2013年10月的《IEEE Transactions on Electron Devices》上。文章由Enrico Zanoni等人撰写,主要关注了影响栅极边缘和肖特基结的失效机制,并探讨了提高这些器件可靠性…

未来趋势:探索Facebook在数字化时代的发展方向

在当今日益数字化的时代&#xff0c;社交媒体已经成为人们日常生活中不可或缺的一部分。Facebook&#xff0c;作为全球最大的社交媒体平台&#xff0c;一直处于行业的前沿&#xff0c;不断地探索和引领社交媒体的发展趋势。本文将深入探讨Facebook在数字化时代的发展方向&#…

算法一:数字 - 两数之和

给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素不能使用两遍。 来源&#xff1a;力扣(LeetCode) 链接&#xf…

详解 C++ 实现K-means算法

一、K-means算法概述 K-means算法是一种非常经典的聚类算法,其主要目的是将数据点划分为K个集群,以使得每个数据点与其所属集群的中心点(质心)的平方距离之和最小。这种算法在数据挖掘、图像处理、模式识别等领域有着广泛的应用。 二、K-means算法的基本原理 K-means算法…

项目中的解耦小能手-观察者模式

目录 1.使用场景 2.什么是观察模式 3.观察者模式结构图 4.代码实现案例 4.1 subject代码实现 4.2 Observer类代码实现 5. 回顾总结 1.使用场景 当一个对象的改变需要同事改变其他对象的时候&#xff0c;如&#xff1a;订单中心-下单成功需要通知库存、物流和积分去做相应…

llama-factory SFT系列教程 (三),chatglm3-6B 大模型命名实体识别实战

文章列表&#xff1a; llama-factory SFT系列教程 (一)&#xff0c;大模型 API 部署与使用llama-factory SFT系列教程 (二)&#xff0c;大模型在自定义数据集 lora 训练与部署 llama-factory SFT系列教程 (三)&#xff0c;chatglm3-6B 命名实体识别实战 简介 利用 llama-fa…

基于百度文心大模型全面重构,小度正式推出AI原生操作系统DuerOS X

4月16日&#xff0c;以“创造未来”为主题的2024百度Create AI开发者大会在深圳举办。百度集团副总裁、小度科技CEO李莹正式发布了小度新一代操作系统DuerOS X&#xff0c;该操作系统是小度基于百度文心大模型推出的全球首个AI原生操作系统。李莹表示&#xff1a;“作为⽂⼼⼤模…