SpringBoot终极讲义第二章笔记
01.关于@Import 和 @ImportResource
@Import注解用法(类上): 一般和@Configuration一起使用,用来导入里面@Bean方法返回的对象
@ImportResource(类上):一般和@Configuration一起使用,用来导入某个.XML文件里的bean
个人觉得这两个注解有点鸡肋
SpringBoot启动类默认扫描的是启动类包所在目录及其子包目录且SpringBoot启动类本身就是一个配置类
这是一个简单的SpringBoot项目,只引入了web,热部署和lombok

MyConfig1和启动类同包,MyConfig2不同包,myconfig3是个Spring的.xml文件

同包及子包下可以获取配置类的bean对象也可以获取到加了@Bean注解的对象(默认方法名)

但是要获取MyConfig2里的@Bean返回对象需要加@Import(MyConfig2.class),即使加了,你也不能获取到类对象

为什么说@Import(xxx.class)鸡肋呢?我用这个不行么?

02.关于SpringBoot的启动日志和失败分析器
启动日志如图 默认INFO级别

失败分析器 例如 我用插件方式再启动一次,提示端口被占用

将信息复制出来
***************************
APPLICATION FAILED TO START
***************************
Description: 这个是失败描述信息
Web server failed to start. Port 8080 was already in use.
Action: 这个是对该失败的修复意见
Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.887 s
[INFO] Finished at: 2023-10-02T02:10:31+08:00
[INFO] ------------------------------------------------------------------------
Process finished with exit code 0
这个是由SpringBoot内置的失败分析器提供的
感觉这个就是在玩么........................
自定义一个失败分析器 继承 AbstractFailureAnalyzer<T>

另外操作

这拿来耍酷么???什么鬼东西

03.延迟初始化
Spring Boot 启动会默认实例化和初始化所有的单例(Singleton)Bean
当然预初始化是有好处的,不然也不会默认.
1.项目启动时就初始化了容器中所有的组件,因此后续提供服务时,速度更快.
2.启动就初始化应用所有组件,可提前发现项目中某个组件的错误.
------------------------------------------------------------------------------------------------------------
那么有些时候延迟初始化,或者说,需要某个Bean时候才去初始化.可以降低内存开销
延迟初始化的方式:
1.调用SpringApplicationBuilder对象的lazyInitialization(true)
针对SpringApplicationBuilder构建的Bean(刚学的就是全部是吧) 全局的
2.调用SpringApplication对象的setLazyInitialization(true) 全局的
3.在application.properties文件中配置 全局的
spring.main.lazy-initialization=true
下面演示三种全局延迟加载方式
创建一个类,定义无参构造

默认情况下启动就会被实例化,交给Spring容器管理

第一种方式:调用SpringApplicationBuilder对象的lazyInitialization(true)
修改启动类.可以看到TestController的构造并没有被调用
注意对于使用@Import或者@ImportResource 导入的Bean无效
用这两个注解导入的Bean可以用自己的配置方式:如xml的话 <bean>里可以指定延迟加载

第二种方式:调用SpringApplication对象的setLazyInitialization(true) 注意点和第一种方式一样

第三种就是

其实实际工作中,全局延迟加载用到的肯定少,除非真的内存不够
如何做局部或者单例的延迟加载呢
1.加上@Lazy注解

2.用@Conditional注解
这两个参数是啥自己查,挺好玩,有内涵
-
ConditionContext context:表示条件的上下文,提供了有关当前条件的执行环境的信息。通过这个上下文,你可以访问 Spring 应用程序上下文、Bean 工厂以及其他条件相关的信息。 -
AnnotatedTypeMetadata metadata:表示与条件关联的注解元数据。通过这个元数据,你可以获取与条件相关的注解信息,例如@Conditional注解的属性等。

04.自定义Banner(这个大概了解,不想写)
在application.properties中
可以通过
spring.main.banner-mode属性对banner进行控制
console:表示在控制台输出
log:表示在日志文件输出
off:表示关闭Banner
05.设置SpringApplication
在SpringBoot的启动类中,我们一般都是
SpringApplication.run(类名.class,args)这种方式启动的,就是调用了SpringApplication的静态run方法,但是都没有对SpringApplication有多少了解.
ChatGPT大概这样解释:
SpringApplication是SpringBoot应用程序的启动引导类,封装了应用的启动过程,过程包括初始化Spring上下文,应用程序的配置,自动配置,组件扫描等 简化了SpringBoot应用程序的开发和部署.通过SpringApplication,开发人员可以轻松的创建,配置和启动SpringBoot引用程序
设置SpringApplication两种方式
1.通过SpringApplication对象的setter方法进行设置,然后调用run()实例方法启动SpringBoot应用
2.通过SpringApplicationBuilder的流式API进行设置,最后调用run方法启动SpringBoot应用
SpringApplicationBuilder是SpringApplication的构建器
先来感受下SpringApplication到底什么鬼

看样子SpringApplication就是用来在启动前,搞事情用的.
比如我这样就关闭了Banner

用SpringApplicationBuilder设置

注意:上面注释可能写的模糊了点.父容器,子容器,好比继承关系,并不是大装小的关系,可以比作多个Spring容器
效果是:父容器不能访问子容器,但是子容器可以访问父容器.
06.监听器
个人认为在SpringBoot中,监听器分为两种
1.监听SpringBootApplication的监听器
2.传统Spring监听器
1.监听SpringBootApplication的监听器
1.1)调用SpringApplication的addListeners()或SpringApplicationBuilder的Listeners()方法添 加事件
1.2)用META-INF/spring.factories文件来配置事件监听器.在该文件中添加如下代码即可注册 事件监听器 例如 org.springframework.context.ApplicationListener=xxx.xxx.xxx.MyListener
注意:META-INF/spring.factories
SpringApplication依次触发的事件
1.触发ApplicationStartingEvent事件
2.触发ApplicationEnvironmentPreparedEvent事件
3.触发ApplicationContextInitializedEvent事件
4.触发ApplicationPreparedEvent事件
5.触发ApplicationStartedEvent事件
该事件结束后才执行ApplicationRunner和CommandLineRunner两接口的回调函数
6.触发AvailabilityChangeEvent事件
7.触发ApplicationReadyEvent事件
8.触发AvailabilityChangeEven事件
9.触发ApplicationFailedEvent事件
事件这么多,但是我们如何使用监听器呢????
定义监听器
1.该监听器交由Spring管理
2.实现ApplicationListener接口泛型写你需要监听的事件
3.重写方法
07.环境前后处理
讲白了就是读取配置文件时需要改变点什么,读取配置文件之后需要改变点什么的骚操作.
08.ApplicationRunner和CommandLineRunner
在SpringApplication的run()完成之前,SpringBoot会自动调用实现了ApplicationRunner和CommandLineRunner接口组件的run()方法,换句话说,一个被Spring管理的Bean,实现了ApplicationRunner或CommandLineRunner接口,并重写方法,就会被调用
CommandLineRunner示例



ApplicationRunner示例

SpringBoot应用的两种命令行参数
1.传统参数即非选项参数,一个个列出的参数:例如:apple banana 这样的属于传统参数
2.双横线开头的选项参数:例如:--book.name="Spring Boot" 这种参数包括了选项名和选项值
这种选项参数实际上就是对Spring Boot进行配置的参数,相当于在application.properties中配 置,且优先级高于application.properties(这个不好说,个人觉得是先读了application.properties 文件之后将值改掉了)
例如



执行结果就是application.properties中的配置

那么将参数配置进去


关于 --book.name="Spring Book" 加双引号是因为Spring Boot之间有空格 不打引号IDEA认为是两个参数
比如写 --book.name=JavaScript 完全可以不打引号



我加了 --server.port=8090 他就会覆盖application.properties里的配置


09.通过ApplicationArguments访问应用参数

相关文章:
SpringBoot终极讲义第二章笔记
01.关于Import 和 ImportResource Import注解用法(类上): 一般和Configuration一起使用,用来导入里面Bean方法返回的对象 ImportResource(类上):一般和Configuration一起使用,用来导入某个.XML文件里的bean 个人觉得这两个注解有点鸡肋 SpringBoot启动类默认扫描的是启动类…...
【C++面向对象侯捷下】4. pointer-like classes,关于智能指针 | 5. function-like classes,所谓仿函数
文章目录 4. pointer-like classes,关于智能指针pointer-like classes,关于智能指针 shared_ptrpointer-like classes,关于迭代器5. function-like classes,所谓仿函数【不懂,跳过】 4. pointer-like classes,关于智能指针 pointer-like classes,关于智…...
社科院与杜兰大学能源管理硕士项目——惊喜会随时间慢慢酝酿而出
我们越来越难感受到惊喜,按部就班的生活让我们丧失了感知力,我们再难以被简单的确幸所打动。试试停下脚步,惊喜往往不期而遇。社科院与杜兰大学能源管理硕士项目是你人生中的小确幸吗 学习是一种持续不断的自我提升,它能让我们逐渐…...
Array简介
概念: 数组(Array)是Java中最简单的数据结构之一,它用于存储固定大小的相同类型元素序列。数组是一个连续分配的内存块,可以通过索引访问其中的元素。元素在数组中按照顺序排列,并使用整数索引来唯一标识每…...
Django的模版使用(Django-03)
一 模版的使用 模板引擎是一种可以让开发者把服务端数据填充到html网页中完成渲染效果的技术。它实现了 把前端代码和服务端代码分离 的作用,让项目中的业务逻辑代码和数据表现代码分离,让前端开发者和服务端开发者可以更好的完成协同开发。 静态网页&…...
详解分布式搜索技术之elasticsearch
目录 一、初识elasticsearch 1.1什么是elasticsearch 1.2elasticsearch的发展 1.3为什么学习elasticsearch? 1.4正向索引和倒排索引 1.4.1传统数据库采用正向索引 1.4.2elasticsearch采用倒排索引 1.4.3posting list 1.4.4总结 1.5 es的一些概念 1.5.1文档和字段 …...
系统架构设计:3 软件架构建模技术与应用
目录 一 架构“4+1”视图 二 论点 1 架构的本质 2 “4+1”视图 (1)逻辑视图 <...
JAVA在线电子病历编辑器源码 B/S架构
电子病历在线制作、管理和使用的一体化电子病历解决方案,通过一体化的设计,提供对住院病人的电子病历书写、保存、修改、打印等功能。电子病历系统将临床医护需要的诊疗资料以符合临床思维的方法展示。建立以病人为中心,以临床诊疗信息为主线…...
TS中的枚举是什么如何使用
在 TypeScript 中,枚举(enum)是一种用于定义命名常量集合的数据类型。枚举可以提高代码的可读性和可维护性,因为它允许开发人员定义并使用有意义的符号名称来表示特定的常量。 下面是一个使用枚举的示例: enum Color…...
UG\NX二次开发 重命名特征对象 UF_OBJ_set_name
文章作者:里海 来源网站:《里海NX二次开发3000例专栏》 感谢粉丝订阅 感谢 林闹 订阅本专栏,非常感谢。 简介 UG\NX二次开发 重命名特征 UF_OBJ_set_name 效果 代码 #include "me.hpp" #include <vector> #include...
低欲望社会:只要我没欲望,世界就对我束手无策?
新的转变正在发生,越来越多的人,正从外部的物质世界向内部的精神世界回归。 比如,中产不再炫名牌,而是改炫读书;打工人不再炫工资,而是炫如何整顿职场。 越来越多的人认为消费主义弥漫着恶臭,…...
抢红包设计
抢红包大致可以分为2步:1 发红包 ;2 抢红包 发红包流程 为了突出红包设计主题,以下设计会忽略支付流程、24H过期退款剩余金额、用户领取红包余额到账等业务,则简化后的相关表设计如下: CREATE TABLE red_record (id…...
k8s集群-6(daemonset job cronjob控制器)
Daemonset 一个节点部署一个节点 当有节点DaemonSet 确保全部 (或者某些) 节点上运行一个 Pod 的副本。加入集群时,也会为他们新增一个 Pod 。当有节点从集群移除时,这些Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。 DaemonSet 的典型用…...
Compose 编译器版本和Kotlin版本对应关系
使用了最新的kotlin版本,compose报错,不兼容,在这里记录一下版本对应关系 值得注意的是Compose Kotlin 编译器扩展 (androidx.compose.compiler) 未关联到 Compose 库版本。相反,它会关联到 Kotlin 编译器插件的版本,…...
vite+vue+cesium
1.创建vite项目 npm create vite 项目名称 2. 选择vuejs/ts 3.在终端输入命令 npm install 4.安装cesium插件,在终端输入命令 npm i cesium vite-plugin-cesium vite -D 5.项目配置cesium 在vite.config.js里进行配置 import { defineConfig } from vite i…...
tcp滑动窗口原理
18.1 滑动窗口 我们再来看这个比喻: 网络仅仅是保证了整个网络的连通性,我们我们基于整个网络去传输,那么是不是我想发送多少数据就发送多少数据呢?如果是这样的话,是不是就会像我们的从一个池塘抽水去灌到另外一个…...
3.4 Android bpfloader初始化流程解读(二)
我继续看bpfloader是如何读取和处理bpf程序的。 4.2 读取代码段之readCodeSections static int readCodeSections(ifstream& elfFile, vector<codeSection>& cs, size_t sizeOfBpfProgDef,const bpf_prog_type* allowed, size_t numAllowed) {...ret = readSect…...
Linux0.12内核源码解读(2)-Bootsect.S
作者:小牛呼噜噜 | https://xiaoniuhululu.com 计算机内功、源码解析、科技故事、项目实战、面试八股等更多硬核文章,首发于公众号「小牛呼噜噜」 文章目录 回顾计算机启动过程8086、80x86是什么意思?寄存器初始化CS:IPCPU是如何和ROM相连的?加载MBR到…...
虚拟环境搭建、后台项目创建及目录调整、封装logger、封装全局异常、封装Response、后台数据库创建
1 虚拟环境搭建 #1 虚拟环境作用多个项目,自己有自己的环境,装的模块属于自己的# 2 使用pycharm创建-一般放在项目路径下:venv文件夹-lib文件夹---》site-package--》虚拟环境装的模块,都会放在这里-scripts--》python࿰…...
每日一练 | 网络工程师软考真题Day39
1、Windows Server 2003操作系统中,IIS6.0不提供以下 效劳。 A.web B.smtp C.pop3 D.ftp 2、Windows Server 2003操作系统中, 提供了远程桌面访问。 A.ftp B.email C…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
