Spring Boot - 自定义SpringApplication
序言
如果要深入了解和自定义SpringApplication
,我们可以从几个方面进行探讨:SpringApplication
的配置选项、运行后通过ConfigurableApplicationContext
获取的能力,以及SpringApplication
实例在运行之前的作用。
# 1. 自定义SpringApplication
当创建一个SpringApplication
实例时,我们可以通过各种方法对其进行自定义,以适应应用需求。
// 创建SpringApplication实例以配置和启动Spring Boot应用,以当前的启动类为配置基础
SpringApplication springApplication = new SpringApplication(SpringBootStarterTestApplication.class);
2
# 设置Banner模式
springApplication.setBannerMode(Banner.Mode.OFF); // 关闭启动Banner
- 类路径添加banner.txt或设置spring.banner.location就可以定制 banner
- 推荐网站:Spring Boot banner 在线生成工具,制作下载英文 banner.txt,修改替换 banner.txt 文字实现自定义,个性化启动 banner-bootschool.net (opens new window)
# 设置激活Profiles
springApplication.setAdditionalProfiles("dev", "prod"); // 激活特定的配置文件
# 设置应用类型
springApplication.setWebApplicationType(WebApplicationType.SERVLET); // 设置为Servlet Web应用
# 添加监听器
springApplication.addListeners(event -> {
if (event instanceof ApplicationReadyEvent) {
// 应用就绪后执行的操作
}
});
2
3
4
5
# 设置默认属性
Properties properties = new Properties();
properties.put("key", "value");
springApplication.setDefaultProperties(properties); // 设置默认属性
2
3
# 禁用命令行属性
springApplication.setAddCommandLineProperties(false); // 禁用命令行参数设置Spring属性
# 完整配置代码
@SpringBootApplication
public class SpringBootStarterTestApplication {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(SpringBootStarterTestApplication.class);
// 设置Banner模式为关闭
springApplication.setBannerMode(Banner.Mode.OFF);
// 设置激活的Profiles
springApplication.setAdditionalProfiles("dev", "test");
// 设置Web应用类型
springApplication.setWebApplicationType(WebApplicationType.SERVLET);
// 添加应用事件监听器
springApplication.addListeners(new ApplicationListener<ApplicationReadyEvent>() {
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
System.out.println("应用已准备就绪..."); // 应用启动完成后的操作
}
});
// 禁用命令行属性
springApplication.setAddCommandLineProperties(false);
// 设置默认属性
Properties properties = new Properties();
properties.setProperty("spring.jpa.show-sql", "true");
springApplication.setDefaultProperties(properties);
// 运行应用
ConfigurableApplicationContext context = springApplication.run(args);
// 自定义操作,例如获取Bean
MyBean myBean = context.getBean(MyBean.class);
myBean.doSomething();
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 链式写法
new SpringApplicationBuilder()
// 指定父上下文配置类
.sources(Parent.class)
// 添加子上下文配置类
.child(Application.class)
// 关闭启动Banner显示
.bannerMode(Banner.Mode.OFF)
// 启动应用
.run(args);
2
3
4
5
6
7
8
9
如果应用只有一个启动类,而没有特别的需要创建父子上下文的复杂场景,可以直接使用这个类作为源进行配置和启动:
new SpringApplicationBuilder()
// 使用单一的启动类作为配置源
.sources(SpringBootStarterTestApplication.class)
// 关闭启动Banner显示
.bannerMode(Banner.Mode.OFF)
// 启动应用
.run(args);
2
3
4
5
6
7
# 2. 运行SpringApplication
ConfigurableApplicationContext context = springApplication.run(args);
运行SpringApplication
实际上是启动Spring应用上下文(ApplicationContext),加载所有Spring管理的Beans,包括你定义的和Spring Boot自动配置的。
# 3. 通过ApplicationContext获取Beans
一旦SpringApplication
运行成功,你将得到一个ConfigurableApplicationContext
实例,你可以通过这个上下文实例获取应用中的所有Beans。
MyBean myBean = context.getBean(MyBean.class); // 通过类型获取Bean
String[] beanNames = context.getBeanDefinitionNames(); // 获取所有Bean的名字
for(String beanName : beanNames) {
System.out.println(beanName);
}
2
3
4
5
还可以通过在application.properties
或application.yml
配置文件中设置debug=true
来让Spring Boot在启动时显示更多的调试信息,包括自动配置的报告,这个报告会告诉你哪些自动配置被应用、哪些没有被应用以及为什么。
SpringApplication实例的作用
在运行.run(args)
之前,SpringApplication
实例用于配置Spring Boot应用的启动过程。你可以通过它来自定义启动过程中的许多方面,包括但不限于启动时的Banner显示、激活的Profiles、Web应用类型、事件监听器、默认属性以及命令行属性的处理。
# 4. 小结
通过创建和配置SpringApplication
实例,你可以细致地控制Spring Boot应用的启动过程。这包括启动时的Banner显示、应用激活的环境配置、监听应用生命周期事件等。运行SpringApplication
后,你将得到一个ConfigurableApplicationContext
实例,它代表了运行中的Spring应用上下文,允许你访问应用中的所有Beans,执行进一步的操作或查询。
这种灵活的配置方式和对运行时上下文的访问能力,使得Spring Boot成为一个功能强大且灵活的框架,能够满足各种应用开发的需求。