在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~~~
总结
- 如果需要处理命令行参数,优先选择
commandlinerunner或applicationrunner。 - 如果只是简单的bean初始化逻辑,使用
@postconstruct。 - 如果需要在应用完全启动后执行逻辑,选择
applicationlistener或@eventlistener。 - 如果需要更灵活的事件监听机制,选择
applicationlistener或@eventlistener。
以上就是在springboot启动时执行特定代码的常见方法小结的详细内容,更多关于springboot启动执行特定代码的资料请关注代码网其它相关文章!
发表评论