详解Spring Boot 启动时执行特定代码逻辑的实现方案

接下来我将一一讲述实现方式,这些操作的源码流程已经在启动过程总结一文中详细叙述过, 这里就只做定义解析和案例展示了,关于源码实现细节可跳转链接查看哈。

1. 使用 CommandLineRunner 和 ApplicationRunner

CommandLineRunner 和 ApplicationRunner 是 Spring Boot 提供的两个接口,用于在应用启动完成后执行逻辑。

  • CommandLineRunner 接收 String[] args 参数,适合处理简单的启动参数。
  • ApplicationRunner 接收 ApplicationArguments 对象,方便解析复杂参数。
CommandLineRunner 示例:
 

java

代码解读

复制代码

import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; ​ @Component public class MyCommandLineRunner implements CommandLineRunner {    @Override    public void run(String... args) throws Exception {        System.out.println("执行 CommandLineRunner 逻辑!");        for (String arg : args) {            System.out.println("启动参数:" + arg);       }   } }

ApplicationRunner 示例:
 

java

代码解读

复制代码

import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; ​ @Component public class MyApplicationRunner implements ApplicationRunner {    @Override    public void run(ApplicationArguments args) throws Exception {        System.out.println("执行 ApplicationRunner 逻辑!");        if (args.containsOption("debug")) {            System.out.println("调试模式启动!");       }   } }

适用场景: 在项目启动后立即执行初始化逻辑,例如加载缓存或注册服务。这是笔者比较推荐的方式,用的最多~~~


2. 使用 ApplicationListener 监听启动事件

Spring 提供了丰富的 事件机制。通过实现 ApplicationListener 接口,我们可以监听应用启动的各个阶段事件,如 ApplicationReadyEvent

示例:
 

typescript

代码解读

复制代码

import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; ​ @Component public class MyApplicationListener implements ApplicationListener<ApplicationReadyEvent> {    @Override    public void onApplicationEvent(ApplicationReadyEvent event) {        System.out.println("应用启动完成,执行 ApplicationReadyEvent 事件监听逻辑!");   } }

适用场景: 当需要在应用完全启动后执行某些操作,如向监控系统注册实例。


3. 使用 @EventListener 注解

@EventListener 注解是一种简化的事件监听机制,允许我们用注解监听特定事件。

 

java

代码解读

复制代码

import org.springframework.boot.context.event.ApplicationStartedEvent; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; ​ @Component public class MyEventListener { ​    @EventListener(ApplicationStartedEvent.class)    public void onApplicationStarted() {        System.out.println("Spring Boot 启动时,执行 ApplicationStartedEvent 监听逻辑!");   } }

适用场景: 适用于监听特定事件,如应用启动或关闭时的操作。

上面使用监听事件的两种方式分别监听了事件ApplicationReadyEventApplicationStartedEvent,同类型的事件如下所示,这里就不一一讲述了,感兴趣的可自行写写示例体会下。


项目推荐:基于SpringBoot2.x、SpringCloud和SpringCloudAlibaba企业级系统架构底层框架封装,解决业务开发时常见的非功能性需求,防止重复造轮子,方便业务快速开发和企业技术栈框架统一管理。引入组件化的思想实现高内聚低耦合并且高度可配置化,做到可插拔。严格控制包依赖和统一版本管理,做到最少化依赖。注重代码规范和注释,非常适合个人学习和企业使用

Github地址github.com/plasticene/…

Gitee地址gitee.com/plasticene3…

微信公众号Shepherd进阶笔记

交流探讨qun:Shepherd_126

4. 使用 @PostConstruct 注解

@PostConstruct 注解用于在 Bean 初始化完成后执行逻辑。这是一个标准的 Java 注解,Spring 会在依赖注入完成后调用它标注的方法。

示例:
 

kotlin

代码解读

复制代码

​ import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; ​ @Service public class MyService {    @PostConstruct    public void init() {        System.out.println("Bean 初始化完成后执行 @PostConstruct 方法!");   } }

适用场景: 当需要在某个 Bean 初始化完成后执行逻辑,比如连接数据库、加载外部资源等。


5. 使用 BeanPostProcessor

BeanPostProcessor 接口允许我们在 Bean 初始化前后插入逻辑。

示例:
 

typescript

代码解读

复制代码

​ import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.stereotype.Component; ​ @Component public class MyBeanPostProcessor implements BeanPostProcessor { ​    @Override    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {        System.out.println("初始化前处理 Bean:" + beanName);        return bean;   } ​    @Override    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {        System.out.println("初始化后处理 Bean:" + beanName);        return bean;   } }

适用场景: 当需要对某些 Bean 的初始化过程进行增强时。


6. 使用 InitializingBean 接口

InitializingBean 接口中的 afterPropertiesSet() 方法会在 Bean 的属性设置完成后执行。

示例:
 

java

代码解读

复制代码

​ import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Component; ​ @Component public class MyInitializingBean implements InitializingBean {    @Override    public void afterPropertiesSet() throws Exception {        System.out.println("Bean 属性设置完成,执行 afterPropertiesSet() 方法!");   } }

适用场景: 当需要在 Bean 初始化后执行一些逻辑。


7. 使用 SmartInitializingSingleton 接口

SmartInitializingSingleton 是一个特殊接口,当 所有单例 Bean 初始化完成后,会触发 afterSingletonsInstantiated() 方法。

示例:
 

typescript

代码解读

复制代码

​ import org.springframework.context.SmartInitializingSingleton; import org.springframework.stereotype.Component; ​ @Component public class MySmartInitializingSingleton implements SmartInitializingSingleton {    @Override    public void afterSingletonsInstantiated() {        System.out.println("所有单例 Bean 初始化完成,执行 afterSingletonsInstantiated() 方法!");   } }

适用场景: 当需要确保所有单例 Bean 初始化完成后再执行操作。


8. 在 main 方法中执行逻辑

在 Spring Boot 应用的入口方法 main 中,我们也可以执行一些初始化逻辑。

示例:
 

typescript

代码解读

复制代码

​ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; ​ @SpringBootApplication public class MyApplication {    public static void main(String[] args) {        System.out.println("Spring Boot 启动前,执行自定义逻辑!");        SpringApplication.run(MyApplication.class, args);        System.out.println("Spring Boot 启动后,执行自定义逻辑!");   } }

适用场景: 当需要在应用启动的前后执行全局逻辑时。


总结

实现方式触发时机适用场景
CommandLineRunner应用启动完成后需要执行启动参数相关逻辑
ApplicationRunner应用启动完成后更方便处理复杂启动参数
@PostConstructBean 初始化完成后Bean 的初始化逻辑
ApplicationListener特定事件触发时监听应用启动或关闭的事件
@EventListener特定事件触发时使用注解简化事件监听
BeanPostProcessorBean 初始化前后增强 Bean 的初始化过程
InitializingBeanBean 属性设置完成后属性注入后的初始化逻辑
SmartInitializingSingleton所有单例 Bean 初始化完成后所有 Bean 完成初始化后的逻辑
main方法应用启动前后在应用启动前或启动后执行全局逻辑

选择合适的实现方式

  • 需要在应用启动后立即执行逻辑CommandLineRunner 或 ApplicationRunner
  • 需要监听应用的启动事件ApplicationListener 或 @EventListener
  • 需要对 Bean 初始化过程进行控制@PostConstruct 或 BeanPostProcessor
  • 需要确保所有 Bean 初始化完成后再执行逻辑SmartInitializingSingleton

不同的实现方式适用于不同的场景,我们可以根据业务需求选择合适的方式,将逻辑插入到 Spring Boot 启动的不同阶段。

### IntelliJ IDEA 中通义 AI 功能介绍 IntelliJ IDEA 提供了一系列强大的工具来增强开发体验,其中包括与通义 AI 相关的功能。这些功能可以帮助开发者更高效地编写代并提高生产力。 #### 安装通义插件 为了使用通义的相关特性,在 IntelliJ IDEA 中需要先安装对应的插件: 1. 打开 **Settings/Preferences** 对话框 (Ctrl+Alt+S 或 Cmd+, on macOS)。 2. 导航到 `Plugins` 页面[^1]。 3. 在 Marketplace 中搜索 "通义" 并点击安装按钮。 4. 完成安装后重启 IDE 使更改生效。 #### 配置通义服务 成功安装插件之后,还需要配置通义的服务连接信息以便正常使用其提供的各项能力: - 进入设置中的 `Tools | Qwen Coding Assistant` 菜单项[^2]。 - 填写 API Key 和其他必要的认证参数。 - 测试连接以确认配置无误。 #### 使用通义辅助编程 一旦完成上述准备工作,就可以利用通义来进行智能编支持了。具体操作如下所示: ##### 自动补全代片段 当输入部分语句时,IDE 将自动提示可能的后续逻辑,并允许一键插入完整的实现方案[^3]。 ```java // 输入 while 循环条件前半部分... while (!list.isEmpty()) { // 激活建议列表选择合适的循环体内容 } ``` ##### 解释现有代含义 选中某段复杂的表达式或函数调用,右键菜单里会有选项可以请求通义解析这段代的作用以及优化意见。 ##### 生产测试案例 对于已有的业务逻辑模块,借助于通义能够快速生成单元测试框架及初始断言集,减少手动构建的成本。 ```python def test_addition(): result = add(2, 3) assert result == 5, f"Expected 5 but got {result}" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值