Spring Boot 学习03-----Spring Boot 特性

简介: 接着来学习Spring Boot,虽然现在很困。

接着来学习Spring Boot,虽然现在很困。


SpringApplication


SpringApplication 类提供了一种方便的方式从main()方法中启动应用,在许多情况下,你可以用SpringApplication.run这个静态方法。如下所示:

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


默认的日志级别是INFO 级别。


启动失败

如果你的应用启动失败,则注册的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.


可以通过命令行开启调试模式

java -jar myproject-0.0.1-SNAPSHOT.jar --debug

自定义Banner

可以通过添加 banner.txt文件改变应用启动时打印的banner,这个文件要添加到classpath下,如果不在classpath下,需要通过spring.banner.location 来指定该文件的位置。如果该文件的编码不是UTF-8,你需要设置spring.banner.charset 。另外,你可以添加banner.gif, banner.jpg, or banner.png等图片文件到你的classpath下或者通过spring.banner.image.location 来设置。更多知识参见 banner


自定义SpringApplication

如果默认的SpringApplication 不满足你的需求,你可以创建一个局部变量,然后自定义它,例如:你想关闭banner,你可以

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


流式构建API

如果你需要构建一个ApplicationContext 分层(多个有父子关系的contexts)或者你更想用一个”fluent” 构建API,你可以使用SpringApplicationBuilder。

这个SpringApplicationBuilder 让多个方法可以链式调用。包括父方法和子方法,如下所示:

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


注意:创建ApplicationContext时有一些限制。例如:web的组成元素中必须包含子context,父context和子context必须使用相同的环境。


应用的事件和监听器

除了Spring Framework 自带的事件以外,例如ContextRefreshedEvent,SpringApplication 还添加了一些额外的应用事件。

注意:一些事件实际上在创建ApplicationContext之前已经被触发。所以你不能通过@Bean注册这些监听器。你可以通过SpringApplication.addListeners(…) 方法或者通过SpringApplicationBuilder.listeners(…) 方法。如果你想这些监听器被自动注册,你可以在你的项目中添加一个META-INF/spring.factories 文件。例如你可以

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


应用事件在下面的列表中,当你的应用运行后:

1. ApplicationStartingEvent: 在运行开始时发送,但是在注册listeners 和注册初始化器之后。

2. ApplicationEnvironmentPreparedEvent 当已经知道要使用的上下文(context)环境,并在context创建之前。

3. ApplicationPreparedEvent在启动 刷新之前,但在加载bean定义之后。

4. ApplicationStartedEvent 上下文被刷新,但是应用和命令行运行被唤起。

5. ApplicationReadyEvent 应用和命令行被唤起。并且处理了相关的回调以指示应用程序准备好服务请求。

6. ApplicationFailedEvent 当启动时出现异常时。

注意:一般您不需要使用应用程序时间,但可以方便的知道它们存在,在内部,Spring Boot使用事件来处理各种任务。


Web环境

SpringApplication 将代替您创建一个正确的的ApplicationContext,默认的,会创建一个AnnotationConfigApplicationContext或者AnnotationConfigServletWebServerApplicationContext具体取决于你开发的Web 应用。

用于确定”Web环境”的算法是相当简单的(基于几个类的存在)。如果需要覆盖默认,可以设置setWebEnvironment(boolean webEnvironment)

也可以通过调用setApplicationContextClass()对ApplicationContext完全控制。

注意:在Junit测试汇总常常需要setWebEnvironment(false)


访问应用程序参数

如果你需要访问传递给SpringApplication.run()的应用程序参数,则可以注入org.springframework.boot.ApplicationArguments bean。ApplicationArguments 接口提供对原始String[]参数以及解析选项和非选项参数的访问:

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 也注册了CommandLinePropertySource,这个可以让你可以通过@Value注解注入简单应用参数。


使用ApplicationRunner 或者CommandLineRunner

SpringApplication启动时如果您需要运行一些特定的代码, 就可以实现ApplicationRunner或CommandLineRunner接口。两个接口都以相同的方式工作,并提供一个单独的运行方式,这将SpringApplication.run(...) 完成之前调用。


外部配置

Spring Boot 允许您外部化您的配置,以便您可以在不同的环境中使用相同的应用程序代码。您可以使用properties文件,YAML文件,环境变量和命令行参数来外部化配置,可以使用@Value注释将属性值直接注入到您的bean中。该注释可通过Spring环境(Environment)抽象访问,或通过@ConfigurationProperties 绑定到结构化对象

Spring Boot 使用非常特别的PropertySource命令,旨在允许合理的覆盖值。属性按以下顺序选择。

1. 在您的HOME目录设置的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 properties (application- {profile} .properties和YAML变体)

13. jar包内的 Profile-specific application properties (application-{profile}.properties和YAML变体)

14. jar包外的应用属性文件(application.properties和YAML变体)。

15. jar包内的应用属性文件(application.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;
    // ...
}


在应用程序类路径(例如:您的jar中),您可以拥有一个application.properties,它为name属性提供了默认属性值。在新环境中运行时,可以再您的jar外部提供了一个application.properties 来覆盖 name属性。对于一次性测试,您可以使用特定的命令行开关启动(例如:java -jar app.jar -name=”Spring”)。


SPRING_APPLICATION_JSON属性可以在命令行中提供一个环境变量。 例如在UN*X shell中:

$ SPRING_APPLICATION_JSON='{"foo":{"bar":"spam"}}' java -jar myapp.jar


配置随机值

RandomValuePropertySource 可用于注入随机值(例如,进入秘密或测试用例)。它可以产生整数,uuid或字符串,例如:

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]}


random.int *语法是 OPEN value (,max) CLOSE ,其中OPEN,CLOSE是任何字符和值,max是整数。 如果提供max,则值为最小值,max为最大值(独占)。


应用程序属性文件

SpringApplication 将从以下位置的 application.propeties文件中加载属性,并将它们添加到Spring Environment中:

1. 当前目录的/config 子目录

2. 当前目录

3. classpath 中/config包

4. classpath root路径

该列表按照优先级从高到低排序。

也可以 使用YAML(’.yml’)文件 替代”.properties”。


properties文件中的占位符

application.properties中的值在使用时通过已有的环境进行过滤。以便您可以引用之前定义的值。例如:

app.name=MyApp
app.description=${app.name} is a Spring Boot application


您也可以使用此技术创建现有Spring Boot属性的“简写“。 有关详细信息,请参见第72.4节“使用”短命令行参数“how-to”。


使用YAML 替代Properties

YAML 是JSON的超集,因此这是分层配置数据一种非常方便的格式。每当您的类路径中都有SnakeYAML 库时。SpringApplication类将自动支持YAML作为properties的替代方法。


加载YAML

Spring Framework提供了两个方便的类,可用于加载YAML文档。YamlPropertiesFactoryBean将YAML作为Properties加载,YamlMapFactoryBean将YAML作为Map加载。

例如,下面YAML文档:

environments:
    dev:
        url: http://dev.bar.com
        name: Developer Setup
    prod:
        url: http://foo.bar.com
        name: My Cool App


将转化为属性:

environments.dev.url=http://dev.bar.com
environments.dev.name=Developer Setup
environments.prod.url=http://foo.bar.com
environments.prod.name=My Cool App


YAML列表表示为具有[index] dereferencers的属性键,例如YAML:

my:
   servers:
       - dev.bar.com
       - foo.bar.com


将转化为属性:

my.servers[0]=dev.bar.com
my.servers[1]=foo.bar.com


将YAML作为Spring环境中的属性文件

可以使用YamlPropertySourceLoader类在Spring环境中将YAML作为PropertySource暴露出来。这允许你使用熟悉@Value注解和占位符语法来访问YAML属性。


多个YAML文件

您可以使用spring.profiles.active键指定单个文件中的多个特定配置文件YAML文档,以指示文档何时应用。


YAML的缺点

YAML文件无法通过@PropertySource注解 加载。因此,在需要以这种方式加载值的情况下,需要使用Properties文件。


Spring Boot的特性就暂时介绍到此处。


参考

https://blog.csdn.net/qq_36348557/article/details/69396589

https://docs.spring.io/spring-boot/docs/2.0.0.RELEASE/reference/htmlsingle/#boot-features-external-config


相关文章
|
1月前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
135 5
|
2月前
|
前端开发 Java 开发者
Spring生态学习路径与源码深度探讨
【11月更文挑战第13天】Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学习路径入手,详细探讨如何系统地学习Spring,并深入解析各个重点的底层实现逻辑。
71 9
|
2月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
3月前
|
前端开发 Java 数据库
SpringBoot学习
【10月更文挑战第7天】Spring学习
46 9
|
2月前
|
Java Kotlin 索引
学习Spring框架特性及jiar包下载
Spring 5作为最新版本,更新了JDK基线至8,修订了核心框架,增强了反射和接口功能,支持响应式编程及Kotlin语言,引入了函数式Web框架,并提升了测试功能。Spring框架可在其官网下载,包括文档、jar包和XML Schema文档,适用于Java SE和Java EE项目。
36 0
|
3月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
261 2
|
13天前
|
Java 数据库连接 Maven
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
自动装配是现在面试中常考的一道面试题。本文基于最新的 SpringBoot 3.3.3 版本的源码来分析自动装配的原理,并在文未说明了SpringBoot2和SpringBoot3的自动装配源码中区别,以及面试回答的拿分核心话术。
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
|
20天前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
72 14
|
2月前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
59 1
SpringBoot入门(7)- 配置热部署devtools工具
|
2月前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
55 2
 SpringBoot入门(7)- 配置热部署devtools工具

热门文章

最新文章