`
getthrough
  • 浏览: 9380 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

跟着官方文档学 SpringBoot 三:spring boot 特性

阅读更多

 

spring boot 特性

【启动相关】

 

1. 启动应用

在启动应用类的 main 方法中调用 SpringApplication 的 run():

public static void main(String[] args) {
	SpringApplication.run(MySpringConfiguration.class, args);
}

 

2. 启动失败

如果应用启动失败了,FailureAnalyzers 会获取错误信息,并得到一个具体解决该问题的办法。

比如,8080 端口被占用,你可能会看到如下信息:

***************************
APPLICATION FAILED TO START
***************************

Description:

Embedded servlet container 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.

 如何创建自己的失败分析器?

1)创建一个自定义的失败分析类,继承 AbstractFailureAnalyzer。如果自己无法处理异常问题,可以通过返回 null 来让其他实现类来处理;

2)在 META/spring.factories 文件中注册该类,如下:

org.springframework.boot.diagnostics.FailureAnalyzer=\
com.example.ProjectConstraintViolationFailureAnalyzer

 如果需要访问 BeanFactory 或者 Environment,那么自定义的 FailureAnalyzer 可以通过实现 BeanFactoryAware 或者 EnvironmentAware 接口。

 

3. 定制 Banner

Banner,即应用启动时的图像,默认为 spring boot:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::   v2.0.0.RELEASE

 通过在 classpath(比如在 resources 文件夹下) 添加一个 banner.txt 或者 在配置文件中设置 spring.banner.location 属性指定文件位置。如果文件的编码不是 UTF-8,那么需要设置 spring.banner.charset 指定编码。

 

除了添加文本文件,也可以添加 banner.gif,banner.jpg 或者 banner.png 的图片,或者设置 spring.banner.image.location 属性指定文件位置,图片会被转换为 ASCII 码的表现形式打印。

博主在 resources 下 添加了 banner.png :

 

启动应用后,显示效果:

 

 

延伸:什么是 classpath?

虽然,classpath 这个词翻译为中文,大家都知道,叫做“类路径”,那么究竟什么是类路径呢?想必许多同学和我一样曾经被困扰过。

classpath 指的是程序编译后 classes(类的字节码文件)所在的目录。在程序没有编译前,通常 .java 文件放置于 java 文件夹下(比如 src/main/java/service/UserService.java),而配置文件通常位于 resources 文件夹下(比如 src/main/resources/application.properties)。当程序编译后,java 文件夹下的 .java 文件会变为 target/classes 文夹下的.class 文件,resources 文件夹下的文件也会被置于 classes 文件夹下,此时的 classes 文件夹即项目的 classpath。

 

如果将 banner.txt 或者 banner.png 直接放置于 src/main/java 文件夹下,由于编译后不在 target/classes 文件夹下,因而是不会生效的。(IntelliJ IDEA 工具编译后的文件都在 target 目录下)

 

4. 定制 SpringApplication

当你觉得默认的 SpringApplication 无法满足使用时,可以通过创建一个本地(相对于 spring-boot-starter 而言)的实例来定制它。

比如,上一小节的定制 Banner 同样可以通过编程的方式实现:

public static void main(String[] args) {
        SpringApplication application = new SpringApplication(Example.class);
        application.setBanner(new MyBanner());
        application.run(args);
}

 也可以关闭它:

public static void main(String[] args) {
        SpringApplication application = new SpringApplication(Example.class);
        application.setBannerMode(Banner.Mode.OFF);
        application.run(args);
}

 

5. 流式 API

通过 SpringApplicationBuilder 对象可以实现链式调用多个方法,并且创建一个分层次的应用上下文环境:

new SpringApplicationBuilder()
		.sources(Parent.class)
		.child(Application.class)
		.bannerMode(Banner.Mode.OFF)
		.run(args);

 在创建分层的 应用上下文时需要注意一些限制,比如 Web 组件必须包含在子上下文中,并且子上下文和父上下文必须使用同一个 Environment。

 

6. 事件和监听器

一些事件是在 ApplicationContext 创建之前被触发的,因此无法在这些事件上注册 listener 作为一个 @Bean。可以通过 SpringApplication.addListeners() 或者 SpringApplicationBuilder.listeners() 方法进行注册;如果想要这些 listeners 自动注册,而不关心应用的创建方式,可以添加 META-INF/spring.factories 文件,通过如下示例方式注册 listener:

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

 

7. Web 环境

SpringApplication 会尝试创建正确类型的 ApplicationContext,默认情况下使用 AnnotationConfigApplicationContext 或者 AnnotationConfigServletWebServerApplicationContext,

这基于正在开发的是否为一个 web 应用。判断一个环境是否为 web 环境的算法是相当简单的,基于几个类是否存在而已。如果想要覆盖它判断环境类型的方式,

可以通过 setWebEnvironment(boolean webEnvironment)设置。通过调用 setApplicationContextClass() 方法可以自己控制 ApplicationContext。在 JUnit 测试环境下使用 SpringApplication时,推荐调用 setWebEnvironment(false) 方法。

 

8. 访问应用参数

如果需要访问那些被传递进 SpringApplication.run() 方法的参数,可以通过注入一个 org.springframework.boot.ApplicationArguments bean。ApplicationArguments 接口提供了访问原生的 String[] 参数和被解析为 option 和 non-option 的参数,如下所示:

 

import org.springframework.boot.*
import org.springframework.beans.factory.annotation.*
import org.springframework.stereotype.*

@Component
public class MyBean {

	@Autowired
	public MyBean(ApplicationArguments args) {
		boolean debug = args.containsOption("debug");
		List<String> files = args.getNonOptionArgs();
		// if run with "--debug logfile.txt" debug=true, files=["logfile.txt"]
	}

}
 Spring Boot 还向 Spring 环境注册了一个 CommandLinePropertySource。这使得可以通过使用 @Value 注释来注入单个应用程序参数。

 

 

9 使用 ApplicationRunner 或者 CommandLineRunner

如果有一些特殊的代码需要在 SpringApplication 启动完成之前运行,那么可以通过实现 ApplicationRunner 或者 CommandLineRunner 接口来完成。这两个接口运行的方式都是一样的,

并且提供单一的 run 方法,run 方法会在 SpringApplication.run() 完成之前被调用。

 

CommandLineRunner 接口将应用参数当作简单的 string 数组进行访问,如下示例:

 

import org.springframework.boot.*
import org.springframework.stereotype.*

@Component
public class MyBean implements CommandLineRunner {

	public void run(String... args) {
		// Do something...
	}

}
 如果定义了多个 CommandLineRunner 或者 ApplicationRunner beans,那么它们必须根据特定的顺序被调用。

 

可以通过额外实现 org.springframework.core.Ordered 接口,或者使用 org.springframework.core.annotation.Order 注解完成顺序调用。

 

10. 退出应用

每个 SpringApplication 都向 JVM 注册了一个关闭的钩子(hook),以确保在退出的时候优雅地关闭 ApplicationContext 。所有的 Spring 标准生命周期的回调都可以使用,比如 DisposableBean 接口或者 @PreDestroy 注解。

 

此外,如果希望在 SpringApplication.exit() 被调用前执行一段特定的退出代码(exit code),那么这些 beans 可以通过实现 org.springframework.boot.ExitCodeGenerator 接口完成。

这些特定的退出代码会被传递至 System.exit() 用来作为状态码返回,如下示例:

@SpringBootApplication
public class ExitCodeApplication {

	@Bean
	public ExitCodeGenerator exitCodeGenerator() {
		return () -> 42;
	}

	public static void main(String[] args) {
		System.exit(SpringApplication
				.exit(SpringApplication.run(ExitCodeApplication.class, args)));
	}

}

 并且,异常类可以通过实现 ExitCodeGenerator 接口和实现 getExitCode()方法,在异常发生时,可以返回退出代码。

 

11. 管理员特性

通过指定 spring.application.admin.enabled 属性为 true(false)启用(不启用)管理员相关特性,这会将 SpringApplicationAdminMXBean 暴露在 MBeanServer 平台。可以通过使用这个特性远程管理 spring boot 应用,这对于服务包装实现很有用。

 

 

【外部化配置】

 

springboot 可以外部化配置,使得相同的代码可以适应不同的环境。简单讲,就是从外部的配置文件获取指定值,不写死代码。

使用 properties 文件、YAML 文件、环境变量、命令行参数这几种方式进行配置。这些配置的属性值可以通过 @Value 注解直接注入到 bean 中,可以通过 Spring 的 Environment 接口实现类来访问,

或者通过 @ConfigurationProperties 绑定到结构化对象。

 

为了实现属性值的合理的覆盖(因为配置方式有多种,可能存在键重复值覆盖),springboot 使用了一种特殊的顺序。属性将按以下顺序读取:

1. Devtools 全局设置。(当开启了 devtools 的情况下,在 ~/ .spring-boot-devtools.properties 配置)

2. 测试类中 @TestPropertySource 注解中的属性值

3. 测试类中 @SpringBootTest#properties 注解中的属性值

4. 命令行参数

5. SPRING_APPLICATION_JSON 的属性值(内嵌在环境变量或系统属性中的JSON)

6. ServletConfig 初始化参数

7. ServletContext 初始化参数

8. 来自 java:comp/env 的 JNDI 属性

9. Java 系统属性值(通过 System.getProperties() 获取的值)

10. 操作系统环境变量

11. RandomValuePropertySource 中有属性值的,并且符合 random.* 格式

12. 没被打进 jar 包的 profile-specific 应用属性(application-{profile}.properties 和 YAML 变量)

13. 被打进 jar 包的应用属性(application-{profile}.properties 和 YAML 变量)

14. 没被打进 jar 包的应用属性(application-{profile}.properties 和 YAML 变量)

15. 被打进 jar 包的应用属性(application-{profile}.properties 和 YAML 变量)

16. 在 @configuration 类上的 @PropertySource 注解属性

17. 默认属性(通过设置 SpringApplication.setDefaultProperties 指定的)

 

在举具体的示例之前,推荐先写一个使用了 name 属性值的组件(@Component),如下:

import org.springframework.stereotype.*
import org.springframework.beans.factory.annotation.*

@Component
public class MyBean {

    @Value("${name}")
    private String name;

    // ...

}

 在 classpath (比如 resources 资源文件夹)中添加一个“application.properties”属性文件,在文件中指定 name 的值,如 name=Lina。

 对于一次性测试,可以在命令行中进行指定,比如:

java -jar app.jar --name="Spring"
 

 

SPRING_APPLICATION_JSON 的属性值可以通过环境变量的方式应用于命令行:

1. 在 UNIX shell 中可以使用如下命令:

$ SPRING_APPLICATION_JSON='{"acme":{"name":"test"}}' java -jar myapp.jar
 该命令表示 在 spring 中 acme.name 对应的属性值为 test。

 

2. 在系统属性(System property)中将 JSON 作为 spring.application.json 使用:

 

$ java -Dspring.application.json='{"name":"test"}' -jar myapp.jar
        3. 通过使用命令行参数来使用 JSON:
$ java -jar myapp.jar --spring.application.json='{"name":"test"}'
        4. 将 JSON 作为一个 JNDI 变量:
java:comp/env/spring.application.json
        
1. 配置随机属性值
对于注入随机值来说, RandomValuePropertySource 很有用。它能产生 integers, longs, uuids, 或者 strings:
my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}
 
2. 访问命令行属性值
默认情况下,SpringApplication 会将所有的命令行参数(以 -- 开头,如 --server.port=9000)转换为一个 property,并添加到 spring 环境中。
注意一下,命令行的属性值相对来说优先级是比较高的(排第四)。如果不想要将命令行参数作为属性值放入 spring 中,可以如下设置来关闭:
SpringApplication.setAddCommandLineProperties(false)
 
3. Application Property 文件
SpringApplication 从如下位置中的 application.properties 文件加载属性:
1) 当前目录下的 /config 目录中(经测试,文档中的“当前目录”为项目根目录,即与 src 同级目录。汗...)
2) 当前目录中(项目根目录)
3) classpath 里的 /config 目录下
4)classpath 根目录下
加载的优先级即以上排列的顺序。
如果不想将属性文件命名为“application.properties”,可以通过指定一个叫做 spring.config.name 的环境属性,比如:
// 设置命令行参数的方式
$ java -jar myproject.jar --spring.config.name=myproject
如果不想属性文件必须在默认读取的位置,可以如下自定义位置(示例指定了两个位置):
$ java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
 注意:由于为了决定那个文件必须被加载, spring.config.name 和 spring.config.location 这两个属性将会被很早使用,因此它们必须在环境属性中定义,比如定义在操作系统环境变量中,系统属性中或者命令行参数中。
如果 spring.config.location 对应的文件是一个目录(directory),那么必须以“/”结尾,这样它会和 spring.config.name 组合起来形成具体文件路径。
4. profile

啥是 spring-boot 的 profile? profile 的中文意思大体上是用于描述一个人的生活,工作或性格等,就是一个简要的概括,具体可以点这里查看英文释义,在spring-boot 中 一个 profile 概括了一个配置文件的使用环境,比如开发环境配置,生产环境配置等,激活不同的 profile,表示使用不同的配置参数。
读取 application-{profile}.properties 文件的位置与 application.properties 相同,不过特定属性文件中数据的优先级总是高于 application.properties 中定义的。如果多个(相同的)特定属性文件被指定,那么后加载的生效。
比如,spring.profiles.active 属性指定的文件在使用 SpringApplication API 配置的文件之后添加,因此 spring.profiles.active 属性指定的具有更高优先级。
5. 属性文件中的占位符
在 application.properties 文件中先定义的属性,可以供后定义的属性使用:
app.name=MyApp
app.description=${app.name} is a Spring Boot application
 
 后续的 spring boot 特性,请见“spring boot 特性之...”系列!
 
 
 
 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 13 KB
  • 大小: 11.9 KB
分享到:
评论

相关推荐

    Spring Boot 3 中文文档

    Spring Boot 作为Java界当之无愧的王者级框架,但遗憾的是一直官方没有提供中文的文档。目前中文互联网上的所有中文文档几乎都是“谷歌一键翻译”,内容晦涩难懂,充满了“春天,弹簧,豆子”这种令人啼笑皆非的翻译...

    Springboot官方文档

    官方文档中不仅有理论介绍,还有大量示例代码,非常适合边学边实践。无论是初学者还是经验丰富的开发者,都能从中受益匪浅。通过阅读这两个版本的文档,你可以对比不同版本间的差异,了解新特性的引入,以便于选择...

    SpringBoot官方文档(中文)

    SpringBoot官方文档(中文)是基于Spring Boot框架的详尽参考指南,旨在帮助开发者快速理解和掌握这个流行的Java应用开发工具。Spring Boot简化了创建独立、生产级别的基于Spring的应用程序,它通过提供默认配置来消除...

    spring-boot中文教程

    描述:Spring Boot中文文档是Spring Boot官方文档的中文翻译版,它包含了Spring Boot的基本介绍、快速入门、核心特性、高级特性等内容,可以帮助用户快速了解和掌握Spring Boot的使用方法和技巧。 Spring Boot是一款...

    spring-boot-actuator-autoconfigure-2.2.0.RELEASE-API文档-中文版.zip

    赠送jar包:spring-boot-actuator-...Maven坐标:org.springframework.boot:spring-boot-actuator-autoconfigure:2.2.0.RELEASE; 标签:springframework、boot、spring、actuator、autoconfigure、中文文档、ja

    spring-boot-configuration-processor-2.3.12.RELEASE-API文档-中文版.zip

    赠送jar包:spring-boot-configuration-processor-2.3.12....Maven坐标:org.springframework.boot:spring-boot-configuration-processor:2.3.12.RELEASE; 标签:springframework、boot、spring、configuration、proc

    spring-boot-2.3.12.RELEASE-API文档-中文版.zip

    Maven坐标:org.springframework.boot:spring-boot:2.3.12.RELEASE; 标签:springframework、boot、spring、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览...

    最新Spring Boot Admin 官方参考指南-中文版-2.x

    Spring Boot Admin 是一个社区驱动的项目,用于监控和管理基于Spring Boot的应用程序。它通过HTTP接口或者Spring Cloud的服务注册中心(如Eureka、Consul)来注册和发现应用。Spring Boot Admin的用户界面是一个建立...

    spring boot2.0官网中文文档

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot...

    SpringBootTest:spring boot 学习

    学习Spring Boot,你可以参考官方文档、在线教程、实战书籍等。官方文档详尽且更新及时,是学习的好帮手。此外,GitHub上有许多开源项目可以作为参考,例如“SpringBootTest-master”这样的项目,可以作为实践学习的...

    spring boot官方文档

    2. 安装Spring Boot:文档为Java开发者提供了多种安装Spring Boot的方式,包括直接通过Maven和Gradle进行安装,或者使用Spring Boot命令行界面(CLI)来安装。同时也提到了如何通过SDKMAN!、OSX Homebrew和MacPorts...

    以电商项目为线索,快速掌握 JDK17 + springboot3 + springcloud Alibaba 专栏源码

    以电商项目为线索,快速掌握 JDK17 + springboot3 + springcloud Alibaba 专栏源码。 2 技术选型 JDK17 持久层: MyBatis-Plus 数据库: MySQL5.7 其他: SpringCloud Alibaba 技术栈 服务注册与发现:Nacos ...

    spring-boot-admin-server-ui-2.5.2-API文档-中文版 (1).zip

    赠送原API文档:spring-boot-admin-server-ui-2.5.2-javadoc.jar; 赠送源代码:spring-boot-admin-server-ui-2.5.2-sources.jar; 赠送Maven依赖信息文件:spring-boot-admin-server-ui-2.5.2.pom; 包含翻译后的...

    11-Spring Boot面试题(92题).pdf

    标题中提到的“Spring Boot面试题(92题).pdf”表明这是一份包含了92个关于Spring Boot的面试题目的文档。Spring Boot是Spring的一个重要项目,它通过约定优于配置的理念,简化了基于Spring的应用开发,被广泛应用...

    spring-boot-2.5.6-API文档-中英对照版.zip

    Maven坐标:org.springframework.boot:spring-boot:2.5.6; 标签:springframework、boot、spring、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容...

    spring-boot中文API文档

    2. **核心特性**:详细解释Spring Boot的核心特性,如自动配置、嵌入式Web服务器(如Tomcat或Jetty)、健康检查端点和运行时指标。 3. **起步依赖**:列出各种起步依赖,如数据访问、Web服务、消息处理等,以及它们...

    Spring Boot技术知识点:Spring Boot2.7以上支持使用Swagger3

    随着版本的升级,Spring Boot引入了对新特性和工具的支持。在Spring Boot 2.7及以上版本,它开始支持Swagger 3,这是一个强大的API文档工具,帮助开发者构建清晰、易于理解的RESTful API接口。 Swagger 3,也称为...

    spring-boot-中文参考手册 SpringBoot中文文档 springboot 中文 文档

    spring-boot-中文参考手册 SpringBoot中文文档 springboot 中文 文档 SpringBoot 帮助您创建可以独立运行的、基于 Spring 的生产级应用程序。我们对 Spring 平台和第三方库有自己的看法,所以您可以从最简单的开始。...

    SpringBoot3 全栈指南教程-尚硅谷学习笔记 2023年

    SpringBoot3全栈指南教程是针对开发者们深入理解并熟练运用Spring Boot 3框架的一份综合教程,由知名教育机构尚硅谷在2023年发布。这份教程旨在帮助学习者掌握Spring Boot 3的核心概念、特性以及如何将其应用于实际...

    SpringBoot2.1官方文档 完整版

    SpringBoot2.1官方文档 十分详细

Global site tag (gtag.js) - Google Analytics