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…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...