SpringBoot 基础篇

news2024/12/23 17:29:46

SpringBooot基本配置

Web容器基本配置

学习了SpringBoot框架之后,我们了解到SpringBoot内嵌了 Tomcat、Jetty、Undertow 三种容器,其默认嵌入的容器是 Tomcat,这个在我们启动 Spring Boot 项目的时候,在控制台上就能看到,具体信息如下:

在这里插入图片描述

我们可以通过修改 pom.xml 来移除内嵌的 Tomcat 更换为其他的容器,比如更换为 Jetty 容器,配置如下

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- 移除 Tomcat -->
            <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>
        </dependency>

添加完毕之后,更新pom文件,编译项目,启动之后如下显示,代表更改成功。
在这里插入图片描述

容器配置application.properties

#禁止Web容器的使用,也可以指定web容器的使用
#spring.main.web-application-type=none

#容器基本配置
#指定端口号
#server.port=8888
#关闭所有的http端点
#server.port=-1
#随机端口
#server.port=0

#响应压缩
server.compression.enabled=true

获取Web容器端口号

@Component
public class MyAppliocationListener implements ApplicationListener<WebServerInitializedEvent> {
    @Override
    public void onApplicationEvent(WebServerInitializedEvent event) {
        System.out.println(event.getWebServer().getPort());//打印获取到的随机端口
    }
}

响应返回到浏览器数据进行压缩
在这里插入图片描述
测试看看,如下图:
没压缩前的的数据大小
在这里插入图片描述
添加配置后压缩大小
在这里插入图片描述
看响应头看到这个就是压缩了
在这里插入图片描述

Tomcat 日志配置

Tomcat 日志分为两种类型

  • 访问日志:主要记录访问者的IP、时间等信息。
  • 服务器内部日志:主要记录内部运行、异常等信息。
#定义日志生成目录
server.tomcat.basedir=tomcat-log
#开启访问日志
server.tomcat.accesslog.enabled=true
#定义日志前缀
server.tomcat.accesslog.prefix=demo-log
#定义日志后缀
server.tomcat.accesslog.suffix=.log
#定义日志日期格式
server.tomcat.accesslog.file-date-format=.yyyyMMdd
#定义日志内容格式
# %h 请求的客户端IP
# %l 用户身份
# %u 用户名
# %t 请求时间
# %r 请求地址
# %s 响应状态码
# %b 响应大小
server.tomcat.accesslog.pattern=%h %l %u %t \"%r"\ %s %b


#开启服务器内部日志
logging.level.org.apache.tomcat = debug;
logging.level.org.apache.catalina = debug;

访问日志:
在这里插入图片描述

服务器内部日志:
在这里插入图片描述

配置文件名称和路径

在Spring Boot 中,配置文件有两种不同的格式,一个是properties,另一个是yaml。
虽然 properties 文件比较常见,但是相对于properties而言,yaml更加简洁明了,而且使用的场景也更多,很多开源项目都是使用yaml进行配置(例如Hexo)。除了简洁,yaml还有另外一个特点

是yaml 中的数据是有序的,properties 中的数据是无序的,在一些需要路径匹配的配置中,顺序就显得尤为重要(例如我们在Spring Cloud Zuul中的配置),此时我们一般采用yaml。
本文主要来看看properties的问题。

位置问题

首先,当我们创建一个Spring Boot工程时,默认resources目录下就有一个application.properties文件,可以在application.properties文件中进行项目配置,但是这个文件并非唯一的配置文件,在Spring Boot中,一共有4个地方可以存放 application.properties文件。
1.当前项目根目录下的config目录下
2.当前项目的根目录下
3.resources目录下的config目录下
4.resources目录下
按如上顺序,四个配置文件的优先级依次降低。如下:
在这里插入图片描述
这四个位置是默认位置,即Spring Boot启动,默认会从这四个位置按顺序去查找相关属性并加载。但是,这也不是绝对的,我们也可以在项目启动时自定义配置文件位置。
例如,现在在resources目录下创建一个javaboy目录,目录中存放一个application.properties文件,那么正常情况下,当我们启动Spring Boot项目时,这个配置文件是不会被自动加载的。我们可以通过spring.config.location属性来手动的指定配置文件位置,指定完成后,系统就会自动去指定目录下查找application.properties文件。

在这里插入图片描述
此时启动项目,就会发现,项目以classpath:/javaboy/application. propertie配置文件启动。这是在开发工具中配置了启动位置,如果项目已经打包成jar,在启动命令中加入位置参数即可;

java -jar properties-o.0.1-SNAPSHOT.jar –
spring.config.location=classpath : /javaboy/

文件名问题

对于application.properties而言,它不一定非要叫application,但是项目默认是去加载名为
application的配置文件,如果我们的配置文件不叫application,也是可以的,但是,需要明确指定配置文件的文件名。
方式和指定路径一致,只不过此时的key是spring.config.name 。
首先我们在resources目录下创建一个app.properties文件,然后在IDEA中指定配置文件的文件名:

在这里插入图片描述
指定完配置文件名之后,再次启动项目,此时系统会自动去默认的四个位置下面分别查找名为
app.properties 的配置文件。当然,允许自定义文件名的配置文件不放在四个默认位置,而是放在自定义目录下,此时就需要明确指定spring.config.location 。
配置文件位置和文件名称可以同时自定义。

属性普通注入方式

普通的属性注入
由于Spring Boot 源自Spring,所以Spring 中存在的属性注入,在Spring Boot中一样也存在。
由于Spring Boot 中,默认会自动加载 application.properties文件,所以简单的属性注入可以直接在这个配置文件中写。
例如,现在定义一个Book类:

public c1ass Book {
private Long id;
private string name;
private string author;
//省略getter/setter

然后,在application.properties文件中定义属性:

book.name=三国演义
book.author=罗贯中book.id=1

按照传统的方式(Spring中的方式),可以直接通过@Value注解将这些属性注入到Book对象中:
例如,现在定义一个Book类:

@component
public class Book {
@value("${book.id}")
private Long id;
@value("${book.name}")
private string name;
@value("${book.author}")
private string author;
//省略getter/setter

注意
Book对象本身也要交给Spring容器去管理,如果Book没有交给Spring容器,那么Book中的属性也无法从Spring容器中获取到值。
配置完成后,在Controller或者单元测试中注入Book对象,启动项目,就可以看到属性已经注入到对象中了。
一般来说,我们在application.properties文件中主要存放系统配置,这种自定义配置不建议放在该文件中,可以自定义properties 文件来存在自定义配置。
例如在resources目录下,自定义book.properties文件,内容如下:

book.name=三国演义
book.author=罗贯中
book.id=1

此时,项目启动并不会自动的加载该配置文件,如果是在XML配置中,可以通过如下方式引用该properties文件:

<context:property-p1aceholder location="classpath:book.properties"/>

如果是在Java 配置中,可以通过@PropertySource来引入配置:

@component
Propertysource("c1asspath:book.properties")public class Book {
@value("${book .id}")
private Long id;
@value("${book.name}")
private string name;
@value("$ {book.author}")
private string author;
//getter/setter

这样,当项目启动时,就会自动加载 book.properties文件。
这只是Spring 中属性注入的一个简单用法,和Spring Boot没有任何关系。

类型安全的属性注入

Spring Boot引入了类型安全的属性注入,如果采用Spring 中的配置方式,当配置的属性非常多的时候,工作量就很大了,而且容易出错。
使用类型安全的属性注入,可以有效的解决这个问题。

@component
@Propertysource("classpath: book.properties")
aconfigurationProperties(prefix = "book")
public class Book {
    private Long id;
    private string name;
    private string author;
//省略getter/setter
}

这里,主要是引入@ConfigurationProperties(prefix = “book”)注解,并且配置了属性的前缀,此时会自动将Spring容器中对应的数据注入到对象对应的属性中,就不用通过@Value注解挨个注入了,减少工作量并且避免出错。

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

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

相关文章

使用 EasyExcel 实现 百万级数据导入导出

前言 在项目开发中往往需要使用到数据的导入和导出&#xff0c;导入就是从Excel中导入到DB中&#xff0c;而导出就是从DB中查询数据然后使用POI写到Excel上。 大数据的导入和导出&#xff0c;相信大家在日常的开发、面试中都会遇到。 很多问题只要这一次解决了&#xff0c;总…

调整数组使奇数全部都位于偶数前面

题目内容&#xff1a; 输入一个整数数组&#xff0c;实现一个函数&#xff0c; 来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分&#xff0c; 所有偶数位于数组的后半部分。 题目思路&#xff1a; 将奇数部分放在前半部分&#xff0c;偶数部分放在后半部分&am…

PySpark-核心编程

2. PySpark——RDD编程入门 文章目录 2. PySpark——RDD编程入门2.1 程序执行入口SparkContext对象2.2 RDD的创建2.2.1 并行化创建2.2.2 获取RDD分区数2.2.3 读取文件创建 2.3 RDD算子2.4 常用Transformation算子2.4.1 map算子2.4.2 flatMap算子2.4.3 reduceByKey算子2.4.4 Wor…

手把手教你制作印刷包装小程序商城

印刷包装行业越来越受到人们的重视&#xff0c;为了更好地满足消费者的需求&#xff0c;搭建一个专属的小程序商城是一种不错的选择。那么&#xff0c;接下来就让我们一起来学习如何搭建印刷包装小程序商城吧&#xff01; 第一步&#xff1a;登录【乔拓云】网后台&#xff0c;进…

学习笔记230818---对于promise失败状态处理的重要性

问题描述&#xff1a; 在项目中经常会出现如上的问题&#xff0c;这是因为&#xff0c;用promise封装的接口或第三方组件方法&#xff0c;如果只对成功的状态做处理&#xff0c;就会造成页面出错&#xff0c;报error。 解决方法 then()的末尾加上.catch(()>{})对失败的状态…

3.小程序的通信模型

通信主体 小程序中通信的主体是渲染层和逻辑层&#xff0c;其中&#xff1a; xxx.scss和xxx.wxml是渲染层 xxx.ts是逻辑层 通信模型 小程序的通信模型发为两部分&#xff1a; 渲染层和逻辑层之间的通信由微信客户端进行转发 逻辑层和第三方服务器之前的通信由微信客户端进行…

Maven介绍_下载_安装_使用_原理

文章目录 1 Maven介绍1.1 Maven是介绍1.2 Maven的作用 2 Maven下载与安装2.1 官网下载2.2 文件目录2.3 环境配置 3 Maven基础概念3.1 仓库分类3.2 依赖坐标3.3 坐标组成 4 Maven配置4.1 本地仓库配置4.2 远程仓库的设置4.3 镜像仓库配置4.4 IDEA配置Maven 5 Maven项目创建5.1 M…

robotframework如何做接口测试?

robotframework(后续简称为robot)是一款自动化测试框架&#xff0c;可能做各种类型的自动化测试。 本文介绍通过robotframework来做接口测试。 在robot当中&#xff0c;python语言的接口测试库名称为RequestsLibrary 安装语法如下&#xff1a; pip install -U requests pip …

AP5414 DC-DC升压恒流 升降压电源驱动IC

产品简介 AP5414 是一种输入电压范围宽&#xff08;0.8~5.5V&#xff09;&#xff0c;可调恒定电流和限定电流两种模式来 驱动白光 LED 而设计的升压型 DC/DC 变换器。该器件能利用单节或双节干电池驱动单 颗大功率白光 LED&#xff0c;同样可以利用一节锂电池驱动两颗、三颗…

基于Opencv的虚拟拖拽项目

预备知识 勾股定理 跟随移动算法 手势识别图解 项目源代码 """ 演示一个简单的虚拟拖拽 步骤&#xff1a; 1、opencv 读取视频流 2、在视频图像上画一个方块 3、通过mediapipe库获取手指关节坐标 4、判断手指是否在方块上 5、是&#xff0c;方块跟着移动 6、…

天津报web前端培训班一定要选贵的吗?

根据这几年数据显示&#xff0c;IT行业飞速发展&#xff0c;岗位需求增多&#xff0c;Web前端是个很新的职业&#xff0c;在国内乃至国际上真正开始受到重视的时间不超过五年&#xff0c;Web前端开发是从网页制作演变而来&#xff0c;名称是有很明显的时代特性。 Web前端就业形…

腾讯大佬用了8小时讲完的Python,整整315集,拿走不谢!

Python在近几年越来越受追捧&#xff0c;很多童鞋或者职场小伙伴想要提升技能-学习Python。 这是非常好的事情&#xff0c;但问题在于很多人不知道学Python做什么&#xff0c;所以什么零碎细末、艰难晦涩、长篇大论的都去看&#xff0c;很容易陷入学不下去的困境。必须要有针对…

C++笔记之std::move和右值引用的关系、以及移动语义

C笔记之std::move和右值引用的关系、以及移动语义 code review! 文章目录 C笔记之std::move和右值引用的关系、以及移动语义1.一个使用std::move的最简单C例子2.std::move 和 T&& reference_name expression;对比3.右值引用和常规引用的经典对比——移动语义和拷贝语…

基础数学问题

目录 P1143 进制转换 P1100 高低位交换 P1866 编号 P3913 车的攻击 P3383 【模板】线性筛素数 P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题 P1572 计算分数 P4057 [Code#1] 晨跑 P2651 添加括号III P2660 zzc 种田 P1403 [AHOI2005] 约数研究 P1469 找筷子 …

未来网络的选择:100G光模块与400G光模块的对比

随着互联网的快速发展和数据传输需求的不断增长&#xff0c;光通信技术在网络领域中扮演着至关重要的角色。光模块是光通信系统中的核心组件之一&#xff0c;而100G光模块和400G光模块是目前应用广泛的两种主要类型。本文将对这两种光模块进行详细的区别对比。 一、传输速率 …

亿级短视频,如何架构?

说在前面 在尼恩的&#xff08;50&#xff09;读者社群中&#xff0c;经常指导大家面试架构&#xff0c;拿高端offer。 前几天&#xff0c;指导一个年薪100W小伙伴&#xff0c;拿到字节面试邀请。 遇到一个 非常、非常高频的一个面试题&#xff0c;但是很不好回答&#xff0…

Python3的print用法

目录 一&#xff1a;print语法 二&#xff1a;print结尾参数end用法 三&#xff1a;print分隔符参数sep用法 四&#xff1a;print固定宽度字符输出 一&#xff1a;print语法 print(*objects, sep , end\n, filesys.stdout, flushFalse) 参数解释&#xff1a; &q…

薅羊毛!Dify升级并可领400万token额度;YC 23夏季营创业团队清单;开源版妙鸭及原理揭秘;清华大模型课程 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; YC 2023年夏季营入选160创业团队&#xff0c;其中6成是AI方向 YC 2023年夏令营有160创业团队入选&#xff0c;遵从了其一贯的价值主张…

Spring AOP简单介绍

什么是AOP 面向切面编程(Aspect-Oriented Programming)是一种编程范式&#xff0c;旨在通过将横切关注点与主要业务逻辑分离&#xff0c;提供一种更好的代码组织和模块化的方式。 AOP的思想是将这些横切关注点从主要业务逻辑中抽离出来&#xff0c;形成一个独立的模块&#x…

【教程】navicat配合HTTP通道远程连接SQLite数据库

前言 &#x1f34a;缘由 好奇的我想查看服务器上宝塔面板的SQLite数据库 久别一月&#xff0c;特来水文。起因是我看到服务器上搭建的宝塔面板&#xff0c;好奇其中使用的SQLite数据库&#xff0c;想用navicat远程连接看一下&#xff0c;奈何不会玩&#xff0c;特来写一篇文…