您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

Spring Boot常用特性

时间:2022-08-23 12:01:53  来源:  作者:临微雨

Spring Applications

SpringApplication: 提供一种便携的方式来启动Spring应用(mAIn函数)。 可以使用静态方法调用 SpringApplication.run

启动

启动日志

  1. Spring启动日志默认为info级别,可以关闭 spring.main.log-startup-info=false
  2. FailureAnalyzers 处理启动时抛出的异常,可以自己实现
  3. 若仍无analyzer处理异常,则可以使用DEBUG级别的日志,或者启动时增加debug属性:
  4. JAVA -jar *.jar --debug

延迟加载

  1. 延迟加载默认关闭,开启有可能导致错误延后发现
  2. 延迟加载开关配置: spring.main.lazy-initialzation=true
  3. 延迟开关代码: SpringApplicationBuilder lazyInitialization; SpringApplication setLazyInitialization
  4. 延迟开关注解: @Lazy(false)

banner

  1. 类: SpringBootBanner
  2. 配置文件 banner.txt
  3. 支持将系统的一些变量输出
  4. 代码设置: SpringApplication.setBanner()
  5. 开关配置 console/log/off: spring.main.banner-mode=off
  6. 地址配置:spring.banner.location

自定义Spring Application

  1. 支持自定义SpringApplication
  2. @SpringBootApplication
    public class MyApplication { public static void main(String[] args) { SpringApplication application = new SpringApplication(MyApplication.class); application.setBannerMode(Banner.Mode.OFF); application.run(args); }}

Builder API

  1. Springboot应用构建
  2. new SpringApplicationBuilder()
    .sources(Parent.class) .child(Application.class) .bannerMode(Banner.Mode.OFF) .run(args);

应用可用性监控

  1. Spring boot actuator
  2. ApplicationAvailability 实现该接口来向外暴露状态

Liveness State

应用是否存活,与外部状态无关

Readiness State

应用是否可用(例如CommandLineRunner ApplicationRunner在被执行时)

状态管理

  • 监听状态改变
  • @Component
    public class MyReadinessStateExporter { @EventListener public void onStateChange(AvailabilityChangeEvent<ReadinessState> event) { switch (event.getState()) { case ACCEPTING_TRAFFIC: // create file /tmp/healthy break; case REFUSING_TRAFFIC: // remove file /tmp/healthy break; } }}
  • 改变状态
  • @Component
    public class MyLocalCacheVerifier { private final ApplicationEventPublisher eventPublisher; public MyLocalCacheVerifier(ApplicationEventPublisher eventPublisher) { this.eventPublisher = eventPublisher; } public void checkLocalCache() { try { // ... } catch (CacheCompletelyBrokenException ex) { AvailabilityChangeEvent.publish(this.eventPublisher, ex, LivenessState.BROKEN); } }}

应用事件监听

除了通常的Spring事件, 比如ContextRefreshedEvent, SpringApplication还可以发送其他事件

有些事件在ApplicationContext创建之前触发,这种无法通过注册bean来注册监听器,可以通过其他方式监听:
SpringApplication.addListeners()/ SpringApplication.listeners()

支持自动化配置listeners. META_INF/spring.factories

org.springframework.context.ApplicationListener=com.example.MyListener

应用实践发送顺序:

  1. An ApplicationStartingEvent is sent at the start of a run but before any processing, except for the registration of listeners and initializers.
  2. An ApplicationEnvironmentPreparedEvent is sent when the Environment to be used in the context is known but before the context is created.
  3. An ApplicationContextInitializedEvent is sent when the ApplicationContext is prepared and ApplicationContextInitializers have been called but before any bean definitions are loaded.
  4. An ApplicationPreparedEvent is sent just before the refresh is started but after bean definitions have been loaded.
  5. An ApplicationStartedEvent is sent after the context has been refreshed but before any application and command-line runners have been called.
  6. An AvailabilityChangeEvent is sent right after with LivenessState.CORRECT to indicate that the application is considered as live.
  7. An ApplicationReadyEvent is sent after any application and command-line runners have been called.
  8. An AvailabilityChangeEvent is sent right after with ReadinessState.ACCEPTING_TRAFFIC to indicate that the application is ready to service requests.
  9. An ApplicationFailedEvent is sent if there is an exception on startup.

当ApplicationContext 被刷新后会触发ContextRefreshedEvent

实现ApplicationContextAware 可注入ApplicationContext

获取启动参数

ApplicationArguments

@Component
public class MyBean {

  public MyBean(ApplicationArguments args) {
      boolean debug = args.containsOption("debug");
      List<String> files = args.getNonOptionArgs();
      if (debug) {
          System.out.println(files);
      }
      // if run with "--debug logfile.txt" prints ["logfile.txt"]
  }

}

ApplicationRunner CommandLineRunner

在SpringApplication启动之后, 需要运行相关代码时, 可以用ApplicationRunner或CommandLineRunner。 接口均实现run方法。 区别是ApplicationRunner使用ApplicationArguments, CommandLineRunner使用字符串数组接收请求参数。

若有多个bean被定义并要求有顺序执行,可以实现
org.springframework.core.Ordered接口或使用org.springframework.core.annotation.Order

应用关闭

每个Spring应用会向JVM注册一个钩子确保ApplicationContext可以顺利关闭 每个标准Spring生命周期的方法会被调用(例如DisposableBean 或@PreDestroy)

可以指定错误码
org.springframework.boot.ExitCodeGenerator(自定义异常错误码)

SpringApplicaiton.exit()

管理特性

启动管理功能,支持远程管理,暴露
SpringApplicationAdminMXBean MBeanServer

spring.application.admin.enabled=true

外部配置

包含Java properties files, yaml files, environment variables, command-line arguments

可通过@Value获取 或者 结构化对象(通过@ConfigurationProperties)

@value(${name:123})

配置优先级

  1. Default properties (specified by setting SpringApplication.setDefaultProperties).
  2. @PropertySource annotations on your @Configuration classes. Please note that such property sources are not added to the Environment until the application context is being refreshed. This is too late to configure certain properties such as logging.* and spring.main.* which are read before refresh begins.
  3. Config data (such as application.properties files).
  4. A RandomValuePropertySource that has properties only in random.*.
  5. OS environment variables.
  6. Java System properties (System.getProperties()).
  7. JNDI attributes from java:comp/env.
  8. ServletContext init parameters.
  9. ServletConfig init parameters.
  10. Properties from SPRING_APPLICATION_JSON (inline JSON embedded in an environment variable or system property).
  11. Command line arguments.
  12. properties attribute on your tests. Available on @SpringBootTest and the test annotations for testing a particular slice of your application.
  13. @TestPropertySource annotations on your tests.
  14. Devtools global settings properties in the $HOME/.config/spring-boot directory when devtools is active.

配置文件按以下优先级覆盖

  1. Application properties packaged inside your jar (application.properties and YAML variants).
  2. Profile-specific application properties packaged inside your jar (application-{profile}.properties and YAML variants).
  3. Application properties outside of your packaged jar (application.properties and YAML variants).
  4. Profile-specific application properties outside of your packaged jar (application-{profile}.properties and YAML variants).

可通过命令行设置配置

使用 -- 前缀

关闭命令行参数
SpringApplication.setAddCommandLineProperties(false)

通过json配置

环境变量: SPRING_APPLICATION_JSON java 启动命令: -Dspring.application.json

外部配置

通过以下顺序:

  1. classpath
    1. classpath
    2. classpath/config
  2. current dir
    1. current dir
    2. current dir/config

修改配置文件名称 Java启动命令 --spring.config.name=···

修改配置文件地址 --spring.config.location
--spring.config.additional-location

配置文件地址支持使用通配符* , 支持多个目录配置文件

环境配置文件 application-{profile}

外部导入

支持外部导入配置文件

spring.config.import=optional:file:./dev.properties

若不支持后缀名可以换写法:

spring.config.import=optional:file:./dev[.ymal]

配置树

可支持按文件层级关系做配置

spring.config.import=optional:configtree:/etc/config

占位符

可使用其他配置作为变量 ${app.name}

配置中的随机变量

支持integer, long, uuid, strings.

${random.value}
${random.int}
${random.long}
${random.uuid}
${random.int(10)}
${random.int[1024, 65536]}

类型安全的配置(使用类配置)

@ConfigurationProperties("") 注意还需要作为一个bean来注入使用

Profiles

任何@Comp.NET, @Configuration, @ConfigurationProperties都可以被@Profile限制。

指定激活profile

spring.profiles.active=dev,hsqldb

spring.profiles.default=none

profile group

profiles

spring.profiles.group.production[0]=proddb
spring.profiles.group.production[1]=prodmq

程序设置profile

SpringApplication.setAdditionalProfiles(...)

Logging

日志格式

  • Date and Time: Millisecond precision and easily sortable.
  • Log Level: ERROR, WARN, INFO, DEBUG, or TRACE.
  • Process ID.
  • A --- separator to distinguish the start of actual log messages.
  • Thread name: Enclosed in square brackets (may be truncated for console output).
  • Logger name: This is usually the source class name (often abbreviated).
  • The log message.

日志颜色

%clr 来指定日志颜色

%clr(%5p)
%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow}

颜色支持: blue,cyan,faint,green,magenta,red,yellow

文件输出

日志文件为10MB, 默认输出ERROR, WARN, INFO logging.file.name logging.file.path

file rotation

  • logging.logback.rollingpolicy.file-name-pattern
  • The filename pattern used to create log archives.
  • logging.logback.rollingpolicy.clean-history-on-start
  • If log archive cleanup should occur when the application starts.
  • logging.logback.rollingpolicy.max-file-size
  • The maximum size of log file before it is archived.
  • logging.logback.rollingpolicy.total-size-cap
  • The maximum amount of size log archives can take before being deleted.
  • logging.logback.rollingpolicy.max-history
  • The maximum number of archive log files to keep (defaults to 7).

日志等级

日志级别: TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF

logging.level.<logger-name>=<level>
logging.level.root=

日志组

spring有预设的日志组 如 web, sql

logging.group.Tomcat=org.Apache.catalina,org.apache.coyote,org.apache.tomcat

logging.level.tomcat=trace

日志关闭钩子

logging.register-shutdown-hook=false

自定义日志配置

指定自定义日志系统

org.springframework.boot.logging.LoggingSystem=

logback: logback-spring.xml, logback.xml

log4j2: log4j2-spring.xml, log4j2.xml

JDK: logging.properties



Tags:Spring Boot   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Spring Boot2.0深度实践 核心原理拆解+源码分析
Spring Boot2.0深度实践:核心原理拆解与源码分析一、引言Spring Boot是一个基于Java的轻量级框架,它简化了Spring应用程序的创建过程,使得开发者能够快速搭建一个可运行的应用...【详细内容】
2024-01-15  Search: Spring Boot  点击:(96)  评论:(0)  加入收藏
Spring Boot 3.0是什么?
Spring Boot 3.0是一款基于Java的开源框架,用于简化Spring应用程序的构建和开发过程。与之前的版本相比,Spring Boot 3.0在多个方面进行了改进和增强,使其更加易用、高效和灵活...【详细内容】
2024-01-11  Search: Spring Boot  点击:(133)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11  Search: Spring Boot  点击:(124)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  Search: Spring Boot  点击:(118)  评论:(0)  加入收藏
Spring Boot Starter的原理
Spring Boot Starter 是 Spring Boot 框架的特性之一,用于简化应用程序的依赖管理和配置。1. 概述: - Spring Boot Starter 是一种包含了一组特定功能和依赖关系的依赖项,旨在...【详细内容】
2024-01-05  Search: Spring Boot  点击:(94)  评论:(0)  加入收藏
Spring Boot 统一响应体处理器详解
在Spring Boot应用中,统一处理响应体是一项非常重要的任务,它可以让我们更方便地统一规范API的返回格式。今天,我们将深入探讨一个优雅的解决方案&mdash;&mdash;使用ResultHand...【详细内容】
2023-11-30  Search: Spring Boot  点击:(150)  评论:(0)  加入收藏
Spring Boot 调优内嵌 Tomcat 的三种方法
在 Spring Boot 中优化 Apache Tomcat 有三种方式,以便实现更好的性能和资源利用率。 线程池(连接器和执行器)设置 使用 NIO 或 APR 连接器 JVM优化线程池设置在 Spring Boot...【详细内容】
2023-11-23  Search: Spring Boot  点击:(227)  评论:(0)  加入收藏
一文搞懂Spring Boot控制器的关键要点
Spring Boot 应用程序中的控制器扮演着重要角色,负责处理传入的 HTTP 请求并确定应发送的适当响应。本文深入介绍 Spring Boot 中的控制器,包括如何创建控制器、处理各种类型...【详细内容】
2023-11-20  Search: Spring Boot  点击:(151)  评论:(0)  加入收藏
Spring Boot中实现订单30分钟自动取消的策略思路及源代码
方式一:使用定时任务 首先,创建一个定时任务,比如每30分钟执行一次检查订单是否需要取消的逻辑。 在订单生成的时候,保存一条记录到数据库,标记订单的状态为"待处理"。 在定时任...【详细内容】
2023-11-20  Search: Spring Boot  点击:(221)  评论:(0)  加入收藏
Spring Boot + Vue3 前后端分离 实战wiki知识库系统
下栽の地止:https://www.itwangzi.cn/2508.html Spring Boot + Vue3 前后端分离 实战wiki知识库系统在当今的Web应用开发中,前后端分离已经成为了一种主流的开发模式。Spring...【详细内容】
2023-11-18  Search: Spring Boot  点击:(144)  评论:(0)  加入收藏
▌简易百科推荐
Web Components实践:如何搭建一个框架无关的AI组件库
一、让人又爱又恨的Web ComponentsWeb Components是一种用于构建可重用的Web元素的技术。它允许开发者创建自定义的HTML元素,这些元素可以在不同的Web应用程序中重复使用,并且...【详细内容】
2024-04-03  京东云开发者    Tags:Web Components   点击:(8)  评论:(0)  加入收藏
Kubernetes 集群 CPU 使用率只有 13% :这下大家该知道如何省钱了
作者 | THE STACK译者 | 刘雅梦策划 | Tina根据 CAST AI 对 4000 个 Kubernetes 集群的分析,Kubernetes 集群通常只使用 13% 的 CPU 和平均 20% 的内存,这表明存在严重的过度...【详细内容】
2024-03-08  InfoQ    Tags:Kubernetes   点击:(17)  评论:(0)  加入收藏
Spring Security:保障应用安全的利器
SpringSecurity作为一个功能强大的安全框架,为Java应用程序提供了全面的安全保障,包括认证、授权、防护和集成等方面。本文将介绍SpringSecurity在这些方面的特性和优势,以及它...【详细内容】
2024-02-27  风舞凋零叶    Tags:Spring Security   点击:(54)  评论:(0)  加入收藏
五大跨平台桌面应用开发框架:Electron、Tauri、Flutter等
一、什么是跨平台桌面应用开发框架跨平台桌面应用开发框架是一种工具或框架,它允许开发者使用一种统一的代码库或语言来创建能够在多个操作系统上运行的桌面应用程序。传统上...【详细内容】
2024-02-26  贝格前端工场    Tags:框架   点击:(47)  评论:(0)  加入收藏
Spring Security权限控制框架使用指南
在常用的后台管理系统中,通常都会有访问权限控制的需求,用于限制不同人员对于接口的访问能力,如果用户不具备指定的权限,则不能访问某些接口。本文将用 waynboot-mall 项目举例...【详细内容】
2024-02-19  程序员wayn  微信公众号  Tags:Spring   点击:(39)  评论:(0)  加入收藏
开发者的Kubernetes懒人指南
你可以将本文作为开发者快速了解 Kubernetes 的指南。从基础知识到更高级的主题,如 Helm Chart,以及所有这些如何影响你作为开发者。译自Kubernetes for Lazy Developers。作...【详细内容】
2024-02-01  云云众生s  微信公众号  Tags:Kubernetes   点击:(51)  评论:(0)  加入收藏
链世界:一种简单而有效的人类行为Agent模型强化学习框架
强化学习是一种机器学习的方法,它通过让智能体(Agent)与环境交互,从而学习如何选择最优的行动来最大化累积的奖励。强化学习在许多领域都有广泛的应用,例如游戏、机器人、自动驾...【详细内容】
2024-01-30  大噬元兽  微信公众号  Tags:框架   点击:(68)  评论:(0)  加入收藏
Spring实现Kafka重试Topic,真的太香了
概述Kafka的强大功能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条消息的值。可以自动或手动增加该值。如果我们由于错误而无法处理消息并想重...【详细内容】
2024-01-26  HELLO程序员  微信公众号  Tags:Spring   点击:(88)  评论:(0)  加入收藏
SpringBoot如何实现缓存预热?
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系...【详细内容】
2024-01-19   Java中文社群  微信公众号  Tags:SpringBoot   点击:(86)  评论:(0)  加入收藏
花 15 分钟把 Express.js 搞明白,全栈没有那么难
Express 是老牌的 Node.js 框架,以简单和轻量著称,几行代码就可以启动一个 HTTP 服务器。市面上主流的 Node.js 框架,如 Egg.js、Nest.js 等都与 Express 息息相关。Express 框...【详细内容】
2024-01-16  程序员成功  微信公众号  Tags:Express.js   点击:(88)  评论:(0)  加入收藏
站内最新
站内热门
站内头条