程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • Spring Boot

    • Spring Boot - 自动配置
    • Spring Boot - 自定义starter
    • Spring Boot - 配置文件
    • Spring Boot - 自定义SpringApplication
      • 1. 自定义SpringApplication
        • 设置Banner模式
        • 设置激活Profiles
        • 设置应用类型
        • 添加监听器
        • 设置默认属性
        • 禁用命令行属性
        • 完整配置代码
        • 链式写法
      • 2. 运行SpringApplication
      • 3. 通过ApplicationContext获取Beans
      • 4. 小结
    • Spring Boot - 生命周期与事件
    • Spring Boot - 事件驱动
    • Spring Boot - Bean 加载方式
    • Spring Boot - 容器资源感知与获取
    • Spring Boot - 定时任务
    • Spring Boot - 异步任务
    • Spring Boot - 内置日志
    • Spring Boot - 函数式 Web
    • Spring Boot - 响应式远程调用
    • Spring Boot - 接口文档
    • Spring Boot - 单元测试
    • Spring Boot - 内容协商
    • Spring Boot - 参数校验
    • Spring Boot - HTTP客户端工具
    • Spring Boot - 控制器请求映射
    • Spring Boot - 请求参数接收
    • Spring Boot - 通用响应类
    • Spring Boot - 全局异常处理
    • Spring Boot - 整合Druid
    • Spring Boot - 整合Thymeleaf
    • Spring Boot - 国际化实现
    • Spring Boot - 自定义注解
  • Spring高级
  • Spring Boot
scholar
2024-03-30
目录

Spring Boot - 自定义SpringApplication

序言

如果要深入了解和自定义SpringApplication,我们可以从几个方面进行探讨:SpringApplication的配置选项、运行后通过ConfigurableApplicationContext获取的能力,以及SpringApplication实例在运行之前的作用。

# 1. 自定义SpringApplication

当创建一个SpringApplication实例时,我们可以通过各种方法对其进行自定义,以适应应用需求。

// 创建SpringApplication实例以配置和启动Spring Boot应用,以当前的启动类为配置基础
SpringApplication springApplication = new SpringApplication(SpringBootStarterTestApplication.class);
1
2

# 设置Banner模式

springApplication.setBannerMode(Banner.Mode.OFF); // 关闭启动Banner
1
  1. 类路径添加banner.txt或设置spring.banner.location就可以定制 banner
  2. 推荐网站:Spring Boot banner 在线生成工具,制作下载英文 banner.txt,修改替换 banner.txt 文字实现自定义,个性化启动 banner-bootschool.net (opens new window)

# 设置激活Profiles

springApplication.setAdditionalProfiles("dev", "prod"); // 激活特定的配置文件
1

# 设置应用类型

springApplication.setWebApplicationType(WebApplicationType.SERVLET); // 设置为Servlet Web应用
1

# 添加监听器

springApplication.addListeners(event -> {
    if (event instanceof ApplicationReadyEvent) {
        // 应用就绪后执行的操作
    }
});
1
2
3
4
5

# 设置默认属性

Properties properties = new Properties();
properties.put("key", "value");
springApplication.setDefaultProperties(properties); // 设置默认属性
1
2
3

# 禁用命令行属性

springApplication.setAddCommandLineProperties(false); // 禁用命令行参数设置Spring属性
1

# 完整配置代码

@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();
    }
}
1
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);
1
2
3
4
5
6
7
8
9

如果应用只有一个启动类,而没有特别的需要创建父子上下文的复杂场景,可以直接使用这个类作为源进行配置和启动:

new SpringApplicationBuilder()
        // 使用单一的启动类作为配置源
        .sources(SpringBootStarterTestApplication.class)
        // 关闭启动Banner显示
        .bannerMode(Banner.Mode.OFF)
        // 启动应用
        .run(args);
1
2
3
4
5
6
7

# 2. 运行SpringApplication

ConfigurableApplicationContext context = springApplication.run(args);
1

运行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);
}
1
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成为一个功能强大且灵活的框架,能够满足各种应用开发的需求。

编辑此页 (opens new window)
上次更新: 2025/03/31, 02:05:41
Spring Boot - 配置文件
Spring Boot - 生命周期与事件

← Spring Boot - 配置文件 Spring Boot - 生命周期与事件→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式