当前位置: 代码网 > it编程>编程语言>Java > 在SpringBoot启动时执行特定代码的常见方法小结

在SpringBoot启动时执行特定代码的常见方法小结

2025年09月18日 Java 我要评论
在springboot的项目中,经常会遇到需要在项目启动后执行一些操作的情形,如加载配置,初始化数据,缓存预热等,本文整理了几种常见的在项目启动时执行特定代码的方法。1.使用 @postconstru

在springboot的项目中,经常会遇到需要在项目启动后执行一些操作的情形,如加载配置,初始化数据,缓存预热等,本文整理了几种常见的在项目启动时执行特定代码的方法。

1.使用 @postconstruct 注解

@slf4j
@component
public class myinit {

    @postconstruct
    public void init() {
        log.info("postconstruct initialized~~~");
    }

}

优点:

  • 简单直接:只需在方法上添加 @postconstruct 注解,方法会在bean初始化后立即执行。
  • 灵活性高:可以在任何bean中使用,适合对特定bean进行初始化逻辑。

缺点:

  • 无法控制执行顺序:多个 @postconstruct 方法的执行顺序不可控。
  • 不适合复杂启动逻辑:在bean初始化完成后执行,但此时可能其他bean尚未完全初始化完成,不适合依赖其他bean的复杂场景。

2.使用 commandlinerunner 接口

commandlinerunner 接口提供了一个 run 方法,该方法会在spring boot应用启动后执行。

@component
@slf4j
public class mycommandlinerunner implements commandlinerunner {
    @override
    public void run(string... args) throws exception {
        log.info("mystartuprunner commandlinerunner initialized~~~");
    }
}

优点:

  • 简单易用:实现 commandlinerunner 接口并重写 run 方法即可。
  • 适合处理命令行参数:可以直接访问命令行参数(string… args)。
  • 顺序可控:可以通过 @order 注解或实现 ordered 接口来控制多个 commandlinerunner 的执行顺序。

缺点:

  • 执行时机较早:在spring应用上下文刷新完成后执行,但此时可能某些bean尚未完全初始化完成,不适合依赖某些复杂bean的场景。

3.使用 applicationrunner 接口

applicationrunner 接口与 commandlinerunner 类似,但它提供了更丰富的 applicationarguments 参数来处理命令行参数。

@slf4j
@component
public class myapplicationrunner implements applicationrunner {
    @override
    public void run(applicationarguments args) throws exception {
        log.info("myapplicationrunner initialized~~~");
    }
}

优点:

  • 更强大的参数处理:提供了 applicationarguments 对象,可以更方便地解析命令行参数(如 --key=value 格式)。
  • 顺序可控:同样可以通过 @order 注解或实现 ordered 接口来控制执行顺序。

缺点:

  • 执行时机较早:与commandlinerunner类似,可能某些bean尚未完全初始化完成,不适合依赖某些复杂bean的场景。

4.使用 applicationlistener 监听 applicationreadyevent

@component
@slf4j
public class myapplicationlistener implements applicationlistener<applicationreadyevent> {
    @override
    public void onapplicationevent(applicationreadyevent event) {
        log.info("myapplicationlistener initialized~~~");
    }
}

优点:

  • 确保应用完全启动applicationreadyevent 是在应用完全启动后触发的,适合执行依赖其他bean或外部资源的逻辑。
  • 灵活性强:可以监听其他spring事件(如 contextrefreshedevent),适合更复杂的场景。

缺点:

  • 无法直接访问命令行参数:如果需要处理命令行参数,需要额外处理。

5.@eventlistener监听applicationreadyevent

可以使用 @eventlistener 注解来监听 applicationreadyevent 事件

@component
@slf4j
public class myeventlistener {
    @eventlistener(applicationreadyevent.class)
    public void onapplicationready() {
        log.info("myeventlistener initialized~~~");
    }
}

优点:

  • 简洁:使用注解方式监听事件,代码更简洁。
  • 确保应用完全启动:与 applicationlistener 相同,适合在应用完全启动后执行逻辑。
  • 灵活性强:可以监听多个事件。

缺点:

  • 无法直接访问命令行参数:同样需要额外处理命令行参数。
  • 执行顺序不可控:多个监听器的执行顺序不可控。

以上几种方式执行后日志打印如下:

[main] com.example.springdemo.init.myinit       : postconstruct initialized~~~
[main] c.e.springdemo.springdemoapplication     : started springdemoapplication in 0.358 seconds (jvm running for 0.809)
[main] c.e.springdemo.init.myapplicationrunner  : myapplicationrunner initialized~~~
[main] c.e.springdemo.init.mycommandlinerunner  : commandlinerunner initialized~~~
[main] c.e.s.init.myapplicationlistener         : myapplicationlistener initialized~~~
[main] c.e.springdemo.init.myeventlistener      : myeventlistener initialized~~~

总结

  • 如果需要处理命令行参数,优先选择 commandlinerunnerapplicationrunner
  • 如果只是简单的bean初始化逻辑,使用 @postconstruct
  • 如果需要在应用完全启动后执行逻辑,选择 applicationlistener@eventlistener
  • 如果需要更灵活的事件监听机制,选择 applicationlistener@eventlistener

以上就是在springboot启动时执行特定代码的常见方法小结的详细内容,更多关于springboot启动执行特定代码的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com