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

Springboot小知识(1):启动类与配置

一、启动类(引导类)

在通常情况下,你创建的Spring应用项目都会为你自动生成一个启动类,它是这个应用的起点。
在Spring Boot中,引导类(也称为启动类,通常是main方法所在的类)是整个应用程序的入口点,用于引导和启动Spring Boot应用。它主要用来加载Spring的上下文自动配置启动内嵌的服务器


1.1 启动类重要注解

一个经典的SpringBoot启动类如下代码所示:

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

@SpringBootApplication注解是Spring Boot启动类的核心,它包含了三个重要注解:
在这里插入图片描述

  1. @SpringBootConfiguration:这个注解实际上是@Configuration的派生注解,表示该类是一个Spring配置类,可以定义@Bean方法。Spring会将这些方法返回的对象作为Bean,添加到应用上下文中。
  2. @EnableAutoConfiguration:这是Spring Boot的自动配置核心,通过这个注解,Spring Boot会根据项目中引入的依赖,自动配置各种组件。例如,如果项目中有spring-boot-starter-web依赖,那么Spring Boot会自动配置一个Web环境,包含内嵌的Tomcat服务器、DispatcherServlet等。
  3. @ComponentScan:这个注解会扫描指定包及其子包下的所有@Component、@Service、@Repository、@Controller等注解,将它们作为Bean加载到Spring的上下文中。默认情况下,它会扫描引导类所在包及其子包,所以通常建议将引导类放在项目根包下。

1.2 SpringApplication.run的功能

在引导类中,SpringApplication.run(Application.class, args)用于启动Spring Boot应用,它执行了多项初始化工作,具体包括以下几个步骤:

  1. 初始化SpringApplication对象:SpringApplication类会根据应用的类型(通常是SpringBootServletInitializer或SpringApplication)决定启动方式。这个类会加载各类初始化器ApplicationContextInitializer和监听器ApplicationListener,同时准备一些默认设置。

  2. 启动引导和环境配置:Spring Boot会初始化Environment对象,加载系统属性、环境变量以及应用配置文件(如application.properties或application.yml),将这些内容加载到Spring上下文环境中。

  3. 创建并配置ApplicationContext:根据应用的类型选择具体的ApplicationContext类型,一般是AnnotationConfigApplicationContext或WebApplicationContext,用来管理应用中的所有Bean。

  4. 自动加载Spring Boot特性:通过@EnableAutoConfiguration,Spring Boot会扫描所有自动配置类,通常是位于META-INF/spring.factories文件中的@Configuration类,自动配置相应的组件(如数据库连接池、数据源、JPA配置等)。

  5. 启动内嵌Web服务器(如有):如果是Web应用,Spring Boot会启动一个内嵌的Web服务器(例如Tomcat或Jetty),并将DispatcherServlet等必要的组件注入到应用上下文中,使应用可以接收和处理HTTP请求。

  6. 启动ApplicationRunner和CommandLineRunner:如果应用中有实现了ApplicationRunner或CommandLineRunner接口的类,Spring Boot会在启动完成后运行这些类中的run方法。它们常用于在应用启动后执行一些初始化任务。


1.3 引导类的实际运行机制

整个引导类运行的关键在于SpringApplication.run()方法,它的运行机制大致如下:

  1. 加载监听器:Spring Boot使用各种事件来驱动应用启动流程,例如,加载ApplicationStartingEvent、ApplicationPreparedEvent等一系列事件,在应用生命周期的不同阶段进行通知。你可以创建自定义的监听器来监听这些事件。

  2. 设置默认属性:Spring Boot会根据项目结构和配置文件设置默认属性,例如端口号、环境配置、日志配置等。你可以在application.properties或application.yml中进行自定义。

  3. 创建上下文和刷新上下文:Spring Boot会创建应用的ApplicationContext,并刷新它。ApplicationContext会自动管理所有Spring组件和Bean的生命周期,注入相应依赖,并准备服务。

  4. 调用生命周期钩子和运行应用:在上下文加载完成后,Spring Boot会调用所有实现SmartLifecycle接口的组件,执行它们的启动逻辑。之后,启动内嵌的服务器,监听请求端口,应用正式启动并进入运行状态。


1.4 使用引导类的配置和扩展

你可以通过自定义SpringApplication来更细粒度地控制Spring Boot的启动行为:

  1. 设置Banner:可以通过SpringApplication.setBanner()或在application.properties中配置自定义启动Banner。
  2. 配置监听器:可以通过SpringApplication.addListeners()方法,添加自定义监听器来捕获启动过程中不同阶段的事件。
  3. 配置初始化器:通过SpringApplication.addInitializers()方法,自定义上下文的初始化行为。

可能看到这里的同学有点蒙,关于基础篇里面,我们只需要知道启动类大致干了点啥就行,究竟是怎么干的,为什么这么干的,这属于核心原理了,到时候放在原理那里讲解,上面每一个小点单独拉出来讲都要参考无数篇文献,都能写一个万字以上的论文,对于基础来讲无须理解那么多,知道有这么个东西为主。

那么现在启动main方法,同时启动了内置的服务器(核心注解中的@EnableAutoConfiguration有相关依赖的话),这样我们整个程序就运行起来了。

二、配置

2.1 application.properties

这是Spring Boot最常用的配置文件,位于src/main/resources目录下。文件名一般为
在这里插入图片描述
Spring Boot会根据这些配置文件自动加载相关属性。如果上述三个文件中关于某一项的配置全部存在(例如port),则其优先级顺序为:
在这里插入图片描述

常见配置项

服务器端口:server.port=8080(修改服务器端口)
数据源配置:

spring.datasource.url=jdbc:mysql://localhost:3306/dbname
spring.datasource.username=root
spring.datasource.password=root

日志配置:logging.level.com.example=DEBUG(设置日志级别)
邮件配置:spring.mail.host=smtp.example.com


2.2 多环境配置

Spring Boot支持根据环境自动加载不同的配置文件,例如application-dev.properties、application-prod.properties等。通过spring.profiles.active来指定当前环境:

spring.profiles.active=dev

例子如下:
在这里插入图片描述
在这里插入图片描述
他在目录中就会有两个配置文件,其中的yml可以如上图所示,在需要参数的地方以变量名称占位,在dev文件中填写具体的参数,区分开开发环境参数与运行环境参数。

yml中:

在这里插入图片描述

dev中:

在这里插入图片描述

作为配置来讲,重中之重就是:后面有一个空格,如果没有空格则配置均会失效!

2.3 读取配置文件中的参数

使用@Value(“${}”)注解即可从配置中读取参数赋值给变量,用例如下:
在这里插入图片描述

在这里插入图片描述

用例代码,这里注意括号中的变量名称需要与配置相同,但是具体的变量名不需要与配置中的变量名相同

在这里插入图片描述

输出:

在这里插入图片描述

2.4 配置文件中引用属性

在这里插入图片描述

2.5 使用类封装属性

使用:@ConfigurationProperties这个注解完成对类的封装,用例如下所示:
在这里插入图片描述

配置文件:
在这里插入图片描述
类文件:
在这里插入图片描述
输出:
在这里插入图片描述
在这里插入图片描述

相关文章:

Springboot小知识(1):启动类与配置

一、启动类(引导类) 在通常情况下,你创建的Spring应用项目都会为你自动生成一个启动类,它是这个应用的起点。 在Spring Boot中,引导类(也称为启动类,通常是main方法所在的类)是整个…...

[CISCN 2019华东南]Web11

[CISCN 2019华东南]Web11 给了两个链接但是都无法访问 这里我们直接抓包试一下 我们插入X-Forwarded-For:127.0.0.1 发现可以修改了右上角的IP地址,从而可以进行注入 {$smarty.version} 查看版本号 if标签执行PHP命令 {if phpinfo()}{/if} 查看协议 {if system(…...

Cypress内存溢出奔溃问题汇总

内存溢出报错信息 <--- Last few GCs ---> [196:0xe58001bc000] 683925 ms: Scavenge 1870.7 (1969.9) -> 1865.6 (1969.9) MB, 6.07 / 0.00 ms (average mu 0.359, current mu 0.444) task; [196:0xe58001bc000] 683999 ms: Scavenge 1872.4 (1969.9) -> 1867.1…...

树莓派4B--OpenCV安装踩坑

报错&#xff1a; Source directory: /tmp/pip-install-pv7l9r25/opencv-python_08fdf5a130a5429f89b0e0eaab39a329 Working directory: /tmp/pip-install-pv7l9r25/opencv-python_08fdf5a130a5429f89b0e0eaab39a329/_skbuild/linux-armv7l-3.7/cmake-build Please check the i…...

电子电气架构 --- 面向服务的汽车诊断架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧,都是来源于自己的想象,只有你真的去做了,才会发现有多快乐。…...

Pytest --capture 参数详解:如何控制测试执行过程中的输出行为

--capture 选项用于控制测试用例执行过程中标准输出&#xff08;stdout&#xff09;和标准错误输出&#xff08;stderr&#xff09;的捕获行为。 --capture 的选项值&#xff1a; fd&#xff08;默认&#xff09; 捕获文件描述符级别的输出&#xff08;stdout 和 stderr&#x…...

IS-IS的原理

IS-IS的基本概念&#xff1a; 概述&#xff1a; IS-IS&#xff0c;中间系统到中间系统&#xff0c;是ISO国际标准化组织为它的无连接网络协议设计的一种动态路由协议 IS-IS支持CLNP网络和IP网络&#xff0c;采用数据链路层封装&#xff0c;区别于ospf只支持IP网络&#xff0…...

C++(4个类型转换)

1. C语言中的类型转换 1. 隐式 类型转换&#xff1a; 具有相近的类型才能进行互相转换&#xff0c;如&#xff1a;int,char,double都表示数值。 2. 强制类型转换&#xff1a;能隐式类型转换就能强制类型转换&#xff0c;隐式类型之间的转换类型强相关&#xff0c;强制类型转换…...

Ubuntu20.04安装NVIDIA显卡驱动

Ubuntu20.04安装NVIDIA显卡驱动 参考资料&#xff1a;https://blog.csdn.net/weixin_39244242/article/details/136282614?fromshareblogdetail&sharetypeblogdetail&sharerId136282614&sharereferPC&sharesourceqq_37397652&sharefromfrom_link 成功配置…...

速盾:介绍一下高防cdn的缓存响应事什么功能?

高防CDN&#xff08;Content Delivery Network&#xff09;是一种基于分布式缓存技术的网络加速服务&#xff0c;能够提供强大的缓存响应功能。它的缓存响应功能主要包括缓存加速和智能缓存两个方面。 首先&#xff0c;高防CDN的缓存加速功能是指通过在全球范围内部署大量的缓…...

Nuclei-快速漏洞扫描器

Nuclei-快速漏洞扫描器 声明 学习内容来自 B 站UP主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 ✍&#x1f3f…...

linux网络抓包工具

linux网络抓包工具 一、tcpdump1.1 基本用法1.2 龙芯平台实例操作 二、wireshark2.1 主要功能2.2 龙芯平台实例操作 一、tcpdump tcpdump 指令可列出经过指定网络界面的数据包文件头&#xff0c;可以将网络中传送的数据包的 “头” 完全截获下来提供分析。它支持针对网络层、协…...

详解桥接模式

引言 在开发过程中&#xff0c;可能会遇到系统设计有多种维度变化的情况&#xff0c;比如我们想画一幅五彩斑斓的画&#xff0c;需要用到12个颜色&#xff0c;但是需要粗细不同的线条&#xff08;粗、中、细&#xff09;&#xff0c;如果用蜡笔&#xff0c;就需要粗中细三种蜡笔…...

探索AI新世界!热门工具与学习资源免费获取

​抖知书老师推荐&#xff1a; 人工智能技术的迅速发展让人们既充满期待又有些迷茫。有人担忧被AI技术取代&#xff0c;有人却积极拥抱这场科技浪潮。无论你处于哪种心态&#xff0c;人工智能已经深入到我们生活的方方面面。如果你希望轻松掌握最新的AI工具与动态&#xff0c;…...

vue3项目搭建-6-axios 基础配置

axios 基础配置 安装 axios npm install axios 创建 axios 实例&#xff0c;配置基地址&#xff0c;配置拦截器,目录&#xff1a;utils/http.js 基地址&#xff1a;在每次访问时&#xff0c;自动作为相对路径的根 // axios 基础封装 import axios from "axios";…...

Django 视图层

from django.shortcuts import render, HttpResponse, redirectfrom django.http import JsonResponse1. render: 渲染模板 def index(request):print(reverse(index))return render(request, "index.html")return render(request, index.html, context{name: lisi})…...

代理IP与百度在信息时代的交互

目录 一、代理IP的基本概念和工作原理 二、代理IP在百度搜索中的多重作用 解决网络延时问题&#xff0c;提高搜索速度 提高网络安全 隐藏用户的真实IP地址&#xff0c;保护个人隐私 突破访问限制&#xff0c;拓宽网络视野 三、代理IP在百度关键词排名优化中的应用 模拟…...

1、Three.js开端准备环境

准备工作 从 CDN 导入 1.安装 VSCode 2.安装 Node.js 3.查看Three.js最新版本 4.如何cdn引入&#xff1a; https://cdn.jsdelivr.net/npm/threev版本号/build/three.module.js 例如&#xff1a;https://cdn.jsdelivr.net/npm/threev0.170.0/build/three.module.js 我们需要…...

什么是Batch Normalization?

一、概念 Batch Normalization是在2015年提出的数据归一化方法&#xff0c;主要用在深度神经网络中激活层之前。它的主要作用是加快模型训练时的收敛速度&#xff0c;使模型训练过程更加稳定&#xff0c;避免梯度爆炸或消失&#xff0c;并起到一定的正则化作用&#xff0c;有时…...

十四(AJAX)、AJAX、axios、常用请求方法(GET POST...)、HTTP协议、接口文档、form-serialize

1. AJAX介绍及axios基本使用 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content&q…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...