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

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注解

 

这两个参数是啥自己查,挺好玩,有内涵

  1. ConditionContext context:表示条件的上下文,提供了有关当前条件的执行环境的信息。通过这个上下文,你可以访问 Spring 应用程序上下文、Bean 工厂以及其他条件相关的信息。

  2. 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&#xff0c;所谓仿函数【不懂&#xff0c;跳过】 4. pointer-like classes,关于智能指针 pointer-like classes,关于智…...

社科院与杜兰大学能源管理硕士项目——惊喜会随时间慢慢酝酿而出

我们越来越难感受到惊喜&#xff0c;按部就班的生活让我们丧失了感知力&#xff0c;我们再难以被简单的确幸所打动。试试停下脚步&#xff0c;惊喜往往不期而遇。社科院与杜兰大学能源管理硕士项目是你人生中的小确幸吗 学习是一种持续不断的自我提升&#xff0c;它能让我们逐渐…...

Array简介

概念&#xff1a; 数组&#xff08;Array&#xff09;是Java中最简单的数据结构之一&#xff0c;它用于存储固定大小的相同类型元素序列。数组是一个连续分配的内存块&#xff0c;可以通过索引访问其中的元素。元素在数组中按照顺序排列&#xff0c;并使用整数索引来唯一标识每…...

Django的模版使用(Django-03)

一 模版的使用 模板引擎是一种可以让开发者把服务端数据填充到html网页中完成渲染效果的技术。它实现了 把前端代码和服务端代码分离 的作用&#xff0c;让项目中的业务逻辑代码和数据表现代码分离&#xff0c;让前端开发者和服务端开发者可以更好的完成协同开发。 静态网页&…...

详解分布式搜索技术之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架构

电子病历在线制作、管理和使用的一体化电子病历解决方案&#xff0c;通过一体化的设计&#xff0c;提供对住院病人的电子病历书写、保存、修改、打印等功能。电子病历系统将临床医护需要的诊疗资料以符合临床思维的方法展示。建立以病人为中心&#xff0c;以临床诊疗信息为主线…...

TS中的枚举是什么如何使用

在 TypeScript 中&#xff0c;枚举&#xff08;enum&#xff09;是一种用于定义命名常量集合的数据类型。枚举可以提高代码的可读性和可维护性&#xff0c;因为它允许开发人员定义并使用有意义的符号名称来表示特定的常量。 下面是一个使用枚举的示例&#xff1a; enum Color…...

UG\NX二次开发 重命名特征对象 UF_OBJ_set_name

文章作者:里海 来源网站:《里海NX二次开发3000例专栏》 感谢粉丝订阅 感谢 林闹 订阅本专栏,非常感谢。 简介 UG\NX二次开发 重命名特征 UF_OBJ_set_name 效果 代码 #include "me.hpp" #include <vector> #include...

低欲望社会:只要我没欲望,世界就对我束手无策?

新的转变正在发生&#xff0c;越来越多的人&#xff0c;正从外部的物质世界向内部的精神世界回归。 比如&#xff0c;中产不再炫名牌&#xff0c;而是改炫读书&#xff1b;打工人不再炫工资&#xff0c;而是炫如何整顿职场。 越来越多的人认为消费主义弥漫着恶臭&#xff0c;…...

抢红包设计

抢红包大致可以分为2步&#xff1a;1 发红包 &#xff1b;2 抢红包 发红包流程 为了突出红包设计主题&#xff0c;以下设计会忽略支付流程、24H过期退款剩余金额、用户领取红包余额到账等业务&#xff0c;则简化后的相关表设计如下&#xff1a; CREATE TABLE red_record (id…...

k8s集群-6(daemonset job cronjob控制器)

Daemonset 一个节点部署一个节点 当有节点DaemonSet 确保全部 (或者某些) 节点上运行一个 Pod 的副本。加入集群时&#xff0c;也会为他们新增一个 Pod 。当有节点从集群移除时&#xff0c;这些Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。 DaemonSet 的典型用…...

Compose 编译器版本和Kotlin版本对应关系

使用了最新的kotlin版本&#xff0c;compose报错&#xff0c;不兼容&#xff0c;在这里记录一下版本对应关系 值得注意的是Compose Kotlin 编译器扩展 (androidx.compose.compiler) 未关联到 Compose 库版本。相反&#xff0c;它会关联到 Kotlin 编译器插件的版本&#xff0c;…...

vite+vue+cesium

1.创建vite项目 npm create vite 项目名称 2. 选择vuejs/ts 3.在终端输入命令 npm install 4.安装cesium插件&#xff0c;在终端输入命令 npm i cesium vite-plugin-cesium vite -D 5.项目配置cesium 在vite.config.js里进行配置 import { defineConfig } from vite i…...

tcp滑动窗口原理

18.1 滑动窗口 我们再来看这个比喻&#xff1a; 网络仅仅是保证了整个网络的连通性&#xff0c;我们我们基于整个网络去传输&#xff0c;那么是不是我想发送多少数据就发送多少数据呢&#xff1f;如果是这样的话&#xff0c;是不是就会像我们的从一个池塘抽水去灌到另外一个…...

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

作者&#xff1a;小牛呼噜噜 | https://xiaoniuhululu.com 计算机内功、源码解析、科技故事、项目实战、面试八股等更多硬核文章&#xff0c;首发于公众号「小牛呼噜噜」 文章目录 回顾计算机启动过程8086、80x86是什么意思?寄存器初始化CS:IPCPU是如何和ROM相连的?加载MBR到…...

虚拟环境搭建、后台项目创建及目录调整、封装logger、封装全局异常、封装Response、后台数据库创建

1 虚拟环境搭建 #1 虚拟环境作用多个项目&#xff0c;自己有自己的环境&#xff0c;装的模块属于自己的# 2 使用pycharm创建-一般放在项目路径下&#xff1a;venv文件夹-lib文件夹---》site-package--》虚拟环境装的模块&#xff0c;都会放在这里-scripts--》python&#xff0…...

每日一练 | 网络工程师软考真题Day39

1、Windows Server 2003操作系统中&#xff0c;IIS6.0不提供以下 效劳。 A&#xff0e;web B&#xff0e;smtp C&#xff0e;pop3 D&#xff0e;ftp 2、Windows Server 2003操作系统中&#xff0c; 提供了远程桌面访问。 A&#xff0e;ftp B&#xff0e;email C&#xf…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合

作者&#xff1a;来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布&#xff0c;Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明&#xff0c;Elastic 作为 …...

医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor

1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...