最新要闻
- 环球热议:“三轮跑车”尬舞!又被比亚迪装到了 国产车控黑科技登场
- 每日快播:安“踏”李宁
- 天天速讯:月薪2万女高管不服从工作安排被炒获赔98万:网友力挺
- 出水芙蓉?真人版《小美人鱼》电影照更新:黑小美人鱼特写来了
- 五金店卖什么卖得最好_五金店卖什么
- 天天新消息丨腾讯国漫手游《狐妖小红娘》宣布停运 6月16日关闭服务器
- 电动版帕萨特这模样?大众ID.7申报图亮相
- 视焦点讯!3599元起 铭凡推出NPB7迷你主机:i7-13700H、双雷电4
- 天天速读:丰田醒了 可睁开眼发现:世界已经变了!
- 南方的网友注意了 沙尘已跨过长江!北京影响已到末期
- 天天时讯:紫薯泥怎么做好吃-紫薯泥
- 【天天新视野】本周发布!徕卡M11 Monochrom详细规格曝光
- 旗舰功能全下放!华为nova 11 Ultra曝光:卫星通信、可变光圈都支持
- 焦点速看:米粉催雷军发小米13 Ultra:你敢发我就敢买
- 电脑里破解软件又少一款!Win11原生录屏免费平替了:新增快捷键
- 绝对忠诚?超八成iPhone用户丢机后秒换新款iPhone
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
SpringApplication详解
- 1. SpringApplication启动范例
- 2. 启动错误
- 3. 懒加载 Lazy Initialization
- 4. Application事件和监听
- 5. Web Environment
- 6. Application可用性
- 7. shutdown hook
- 1. JVM自带的shutdownHook
- 2. 监听Spring的ContextCloseEvent
- 3. 实现DisposableBean接口
- 4. 使用注解@PreDestory
- 8. Application Startup Tracking
- 参考
1. SpringApplication启动范例
public static void main(String[] args) { var application = new SpringApplicationBuilder() .lazyInitialization(true) // 懒加载 .listeners(event -> log.info("Event type {}", event)) // ApplicationListener .logStartupInfo(false) // 不输出开启时的日志,例如那个Spring .sources(WorkbenchApplication.class) // 增加更多的源(source)到应用中,这部分源会被自动注入 .web(WebApplicationType.SERVLET) .registerShutdownHook(true) // 应用关闭hook .build();// application.setApplicationContextFactory(webApplicationType -> null); application.setApplicationStartup(new BufferingApplicationStartup(20)); application.run(args); }
2. 启动错误
错误分析器 FailureAnalyzer,用来处理spring application 上下文相关的异常,也就是启动时的异常。
配置文件位置META-INF/spring.factories
(指导Spring boot找到指定的自动配置文件),继承org.springframework.boot.diagnostics.FailureAnalyzer
。
\用来换行,否则就需要写在一行;
(相关资料图)
org.springframework.boot.diagnostics.FailureAnalyzer=\com.demo.analyzer.ProjectConstraintViolationFailureAnalyzer
import org.springframework.boot.diagnostics.FailureAnalysis;import org.springframework.boot.diagnostics.FailureAnalyzer;public class ProjectConstraintViolationFailureAnalyzer implements FailureAnalyzer { @Override public FailureAnalysis analyze(Throwable failure) { return new FailureAnalysis("Failure test", "restart the service", failure); }}
3. 懒加载 Lazy Initialization
见代码第三行
推迟bean
加载时间,在需要时才会加载,可以降低应用启动时间。
可能的问题:
- 推迟了问题被发现的时间,因为加载时间推迟了;
使用方式:
SpringApplicationBuilder
的lazyInitialization()
方法;SpringApplication
的setLazyInitialization
方法;- 配置文件增加:
spring.main.lazy-initialization=true
注解@Lazy(false)
,可以使懒加载配置不对对应属性生效。可生效的属性包括:@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.FIELD})
实际使用建议斟酌一下。
4. Application事件和监听
代码第四行就是事件监听的注册代码,可以注册多个监听
除了常规的Spring框架时间,例如ContextRefreshedEvent
,一个SpringApplication
也会发送一些额外应用事件。
注:有一些时间触发比
SpringApplication
更早,可以使用@Bean
方式,通过SpringApplication.addListeners(…)
method 或者SpringApplicationBuilder.listeners(…)
method进行注册。或者,你也可用通过添加META-INF/spring.factories
文件,org.springframework.context.ApplicationListener
关键字进行注册org.springframework.context.ApplicationListener=com.example.project.MyListener
以下为应用运行时发送的事件,按发送顺序排列:
编号 | 事件 |
---|---|
1 | ApplicationStartingEvent |
2 | ApplicationEnvironmentPreparedEvent |
3 | ApplicationContextInitializedEvent |
4 | ApplicationPreparedEvent |
5 | ApplicationStartedEvent |
6 | AvailabilityChangeEvent |
7 | ApplicationReadyEvent |
8 | ApplicationReadyEvent |
9 | ApplicationFailedEvent |
不要在监听里写太多的代码,使用
ApplicationRunner
或者CommandLineRunner
如果你的应用继承了SpringApplication
实例,一个监听可能会接收到同一个事件的多个实例,可以考虑注入对应的上下文进行比较。
上下文(context)可以通过实现ApplicationContextAware
注入,或者在类型为bean
的监听中使用@Autowired
注入。
出现该问题是因为,应用事件会通过
Spring
框架的事件推送机制发送,该机制会保证一个context
和他的子女父母context
都被通知。
也可以实现ApplicationListener
接口自动注入类来注册监听。
@Component@Slf4jpublic class ShutdownHookDemo implements ApplicationListener { @Override public void onApplicationEvent(ApplicationEvent event) { log.info("shutdown hook, ContextClosedEvent"); }}
5. Web Environment
代码第七行
如果使用
Spring MVC
,那么会使用AnnotationConfigServletWebServerApplicationContext
;如果不使用
Spring MVC
而是使用Spring WebFlux
,那么会使用AnnotationConfigReactiveWebServerApplicationContext
;其他情况,使用
AnnotationConfigApplicationContext
;
可以自行重载Web应用类型,类型代码如下:
- NONE,不会启动为web应用,也不会启动嵌入的web服务;
- SERVIET,作为一个
servlet-based
web服务启动,会启动一个嵌入式的servlet
web服务,默认选项,Spring MVC
使用这个选项; - REACTIVE,作为一个
reactive-based
web服务启动,会启动一个嵌入式的reactive
web服务,Webflux
使用这个选项;
也可以通过
代码第十行
可以通过调用setApplicationContextFactory(…)
,实现对于应用上下文ApplicationContext
的完全控制。
6. Application可用性
代码第四行,可用性的改变也会出发事件
两个可用性状态Liveness
和Readiness
,注意,即使出现了错误,应用此时还是在运行的。
Liveness
是应用的内部运行状态,如果是BROKEN
代表应用内部已经发生问题且无法恢复,需要重启,CORRECT
代表正常。
Readiness
是指应用是否准备好了接受通信请求,ACCEPTING_TRAFFIC
状态代表ok。REFUSING_TRAFFIC
状态代表拒绝通信,在执行CommandLineRunner
和ApplicationRunner
时会出现,或者是应用过度繁忙时也会出现。
可用性状态可以用来配合K8S完成健康监测。
7. shutdown hook
1. JVM自带的shutdownHook
Runtime.getRuntime().addShutdownHook(new Thread(() -> log.info("shutdown hook, jvm demo")));
2. 监听Spring的ContextCloseEvent
@Component@Slf4jpublic class ShutdownHookDemo implements ApplicationListener { @Override public void onApplicationEvent(ContextClosedEvent event) { log.info("shutdown hook, ContextClosedEvent"); }}
3. 实现DisposableBean接口
@Component@Slf4jpublic class ShutdownHookDemo implements DisposableBean { @Override public void destroy() { log.info("shutdown hook, disposable bean"); }}
4. 使用注解@PreDestory
使用ApplicationRunner
或者CommandLineRunner
,或者使用spring.factories
进行注入,否则注入不会生效。
@Slf4j@Componentpublic class TestApplicationRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { log.info("test"); } @PostConstruct public void init() { Runtime.getRuntime().addShutdownHook(new Thread(() -> log.error("shutdown hook, jvm runtime hook"))); } @PreDestroy public void preDestroy() { log.info("shutdown hook, pre destroy"); }}
8. Application Startup Tracking
track应用启动。
import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;@SpringBootApplicationpublic class MyApplication { public static void main(String[] args) { SpringApplication application = new SpringApplication(MyApplication.class); application.setApplicationStartup(new BufferingApplicationStartup(2048)); application.run(args); }}
可选ApplicationStartup
类型,
The first available implementation, FlightRecorderApplicationStartup
is provided by Spring Framework. It adds Spring-specific startup events to a Java Flight Recorder session and is meant for profiling applications and correlating their Spring context lifecycle with JVM events (such as allocations, GCs, class loading…). Once configured, you can record data by running the application with the Flight Recorder enabled:
Spring Boot ships with the BufferingApplicationStartup
variant; this implementation is meant for buffering the startup steps and draining them into an external metrics system. Applications can ask for the bean of type BufferingApplicationStartup
in any component.
参考
[1] Springboot doc
[2] SpringBoot下实现Shutdown Hook的几种方式
关键词:
-
SpringApplication详解
1 SpringApplication启动范例publicstaticvoidmain(String[]args){varapplication=newSpringApplic
来源: -
焦点讯息:OpenAI Translator | 基于ChatGPT API全局翻译润色解析及ORC上传图像翻译工具
OpenAITranslator|基于ChatGPTAPI全局翻译润色解析及ORC上传图像翻译工具OpenAITranslator,一款基于Cha...
来源: SpringApplication详解
焦点讯息:OpenAI Translator | 基于ChatGPT API全局翻译润色解析及ORC上传图像翻译工具
当前报道:锁屏面试题百日百刷-kafk篇(一)
环球热议:“三轮跑车”尬舞!又被比亚迪装到了 国产车控黑科技登场
每日快播:安“踏”李宁
天天速讯:月薪2万女高管不服从工作安排被炒获赔98万:网友力挺
出水芙蓉?真人版《小美人鱼》电影照更新:黑小美人鱼特写来了
Turtlebot3仿真代码学习笔记
世界热点!.NET 个人博客系统
五金店卖什么卖得最好_五金店卖什么
天天新消息丨腾讯国漫手游《狐妖小红娘》宣布停运 6月16日关闭服务器
电动版帕萨特这模样?大众ID.7申报图亮相
视焦点讯!3599元起 铭凡推出NPB7迷你主机:i7-13700H、双雷电4
天天速读:丰田醒了 可睁开眼发现:世界已经变了!
南方的网友注意了 沙尘已跨过长江!北京影响已到末期
day07-OpenFeign-服务调用
看热讯:stm32 使用多串口通信调试总结
速讯:记录-css实现交融文字效果
环球最新:阿里云 - 连接不同VPC方案
天天时讯:紫薯泥怎么做好吃-紫薯泥
【天天新视野】本周发布!徕卡M11 Monochrom详细规格曝光
旗舰功能全下放!华为nova 11 Ultra曝光:卫星通信、可变光圈都支持
焦点速看:米粉催雷军发小米13 Ultra:你敢发我就敢买
电脑里破解软件又少一款!Win11原生录屏免费平替了:新增快捷键
绝对忠诚?超八成iPhone用户丢机后秒换新款iPhone
全球快讯:从spring boot泄露到接管云服务器平台
ThreadPoolExecutor源码学习
图文介绍 Windows 系统下打包上传 IOS APP 流程
【Visual Leak Detector】使用注意事项
一个TCP 连接可以发送多少个HTTP请求?
为什么打不开空间_腾讯官方的解决方法
《终结者》T-1000成真!科学家研制出可固液转变机器人 形态科幻
当前观点:或命名为“高山” 魏牌全新插混MPV申报:红旗HQ9有话要说
印度版大G来啦!4排10座轴距超3米 马力只有90匹
坚持元宇宙不动摇:Meta百万美元年薪招聘VR程序员
环球观热点:女子下班回工作消息获赔加班费引热议!调查称仅1成多人拒绝下班秒回工作
全球即时:卢拉发推预告:“我将启程前往中国”,期望加强巴中贸易伙伴关系
世界简讯:【一行代码秒上云】Serverless六步构建全栈网站
科创人·中建三局一公司尹奎:数字化变革能创造全新行业,其意义超越形式、范式创新
当前关注:CAD二次开发,安装程序中写注册表
滚动:低代码开发,是稳扎稳打还是饮鸩止渴?
快报:【金融街发布】人民银行:3月货币供应量M2同比增长12.7% 比上月回落0.2个百分点
能打比亚迪宋PLUS DM-i 哈弗枭龙MAX开订:用上Hi4电四驱
焦点关注:两大巨头“世纪大和解”!腾讯视频官方入驻抖音:昵称“鹅家”
天天日报丨13代标压高能轻薄本!华硕无畏15i 2023到手5699元:OLED好屏值得拥有
又来一份10年协议!微软与英国EE达成云游戏合作
焦点播报:《圣斗士星矢》真人版战斗预告:变身画面超燃!
温彬等:食品、能源价格双双下探,促内需政策仍须发力
精彩看点:【业务自动化平台】上海道宁与UiPath致力于让每个企业、每个人都能充分利用自动化带来的成就和优势
微服务保护--Sentinel
ASP.NET Post, FromBody 接参总是null 空值. Web api 前端传递是有值的,怎么回事?
【新华500】新华500指数(989001)11日微跌0.07%
快消息!7000mAh超大电池比肩充电宝!华为畅享60X官宣:实用体验才是王道
世界快资讯:女子看电视惊现3000多秒超长广告 直呼太离谱
环球今亮点!国内最新快递服务满意度出炉:顺丰、京东、邮政排前三 你经常用哪家?
简讯:大家不看电视了?海信:电视开机率低是个伪命题
环球快讯:别YY失控!深圳一辆特斯拉钣喷中心破窗而出 差点掉下来:官方回应
热议:希腊神话的英语典故
重试,让程序更健壮
aix系统如何查看网卡配置
模型训练与推理中为什么需要使用GPU?基本概念梳理
全球球精选!2023年最新iOS打包发布流程汇总
韩总统府称网传美监听韩政府文件部分系伪造
多地现沙尘暴!中央气象台首席预报员:沙尘天气无需根治
英特尔锐炫A750最新驱动游戏实测:进步巨大
刷新认知!男子站临海近乎垂直石壁上钓鱼:网友直呼请勿模仿
环球新动态:世界首个“九尾狐甲鱼”化石被发现:长相奇特怪异
全球第一批25个GPT模型开始自由生活
当前资讯!应用火山引擎 DataTester“避坑”,抖音实现用 A/B 实验快速试错
路由跳转及传参
每日消息!堆叠面积图的优点和缺点有哪些?
跟ChatGPT聊天、需求润色优化,禅道OpenAI 插件发布!
三星9082怎么恢复出厂设置?三星9082手机参数
索尼w570现在值多少钱?索尼w570参数
台式机怎么设置无线上网?台式机怎么调节屏幕亮度?
巧克力键盘是什么意思?巧克力键盘和机械键盘的区别是什么?
诺基亚n82上市价格是多少?诺基亚n82手机参数
每日时讯!鑫顺看市:4.11黄金守住1980关键位,多头或再次卷土重来
当前资讯![网络]应用层协议:HTTP / HTTPS
用ChatGPT问.NET的相关问题,.NET工程师的前景不错
每日热讯!男子被鱼刺卡喉硬吞饭团:结果扎穿食管
天天速看:力压宝马X5 理想L7交付首月狂卖8009台:稳居国内中大型SUV销量第一
世界热门:米其林中国回应顾客用餐后上吐下泻:非常重视消费者健康安全
焦点!紫光展锐首款车规级5G座舱芯片平台A7870公布:6nm加持、NPU算力媲美骁龙8155
全球热推荐:蓝牌要成历史?新款奔腾T90官图:全新车牌引遐想
世界新消息丨又萌又飒!池州一高校女生穿公主裙一“跑”走红
在寻找 LastPass 的更好替代品吗?
当前简讯:金融系统NTP时钟同步(网络校时服务器)架设工作详情
[网络]TCP的三次握手与四次挥手[转载]
每日焦点!Python程序笔记20230301
云图说|图解云消息服务KooMessage
环球微资讯!充电仅需18秒!中科大研发出新型水系锌离子电池
或为问界M9 赛力斯大型SUV专利图曝光:有点“震撼”
天天头条:车评人表扬华为问界:看不见的底盘件 大面积用铝合金材料
环球信息:林州“网红试胆石”出现裂缝仍有游客打卡 官方回应
天天速讯:299元 小米小爱音箱儿童版开卖:童声专项识别优化
世界银行上调2023年全球经济增长预期至2%
关于算法开源乱七八糟事
【报资讯】RDIF.vNext全新低代码快速开发框架平台发布
环球聚焦:基于pdfbox实现的pdf添加文字水印工具