当前位置: 代码网 > it编程>编程语言>Java > SpringBoot启动后自动执行方法的各种方式对比

SpringBoot启动后自动执行方法的各种方式对比

2025年04月29日 Java 我要评论
1. springboot启动后自动执行方法的各种方式1.1 @postconstruct 注解作用:在依赖注入完成后执行初始化方法。适用场景:需要在bean初始化时执行某些操作(如配置、预加载数据)

1. springboot启动后自动执行方法的各种方式

1.1 @postconstruct 注解

作用:在依赖注入完成后执行初始化方法。

适用场景:需要在bean初始化时执行某些操作(如配置、预加载数据)。

注意:该方法在bean初始化阶段执行,此时应用可能未完全启动(如数据库连接未就绪)。

示例代码:

import javax.annotation.postconstruct;
import org.springframework.stereotype.component;
 
@component
public class mypostconstructbean {
    @postconstruct
    public void init() {
        system.out.println("postconstruct 方法执行");
        // 执行初始化逻辑
    }
}

1.2. 实现 initializingbean 接口

作用:通过重写 afterpropertiesset 方法实现初始化。

适用场景:需要在属性注入后执行操作,与 @postconstruct 类似但需实现接口。

示例代码:

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("initializingbean 的 afterpropertiesset 方法执行");
        // 执行初始化逻辑
    }
}

1.3. 实现 applicationrunner 接口

作用:在spring应用上下文刷新后执行,支持接收命令行参数。

适用场景:需要在应用启动完成后执行操作,此时bean已初始化完毕。

示例代码:

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 执行");
        // 执行逻辑,可访问命令行参数 args
    }
}

1.4. 实现 commandlinerunner 接口

作用:与 applicationrunner 类似,但参数为 string[]。

适用场景:需要接收简单命令行参数时使用。

示例代码:

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 执行");
        // 执行逻辑,可访问 args 参数
    }
}

1.5. 实现 applicationlistener 接口

作用:通过 applicationlistener 监听应用完全启动事件。

适用场景:需要在应用完全就绪后执行操作(如启动后发送通知)。

示例代码:

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 触发,应用已启动");
        // 执行逻辑,此时可安全访问所有bean
    }
}

1.6. 使用 @bean 的 initmethod 属性

作用:在spring配置类中定义bean时,通过 initmethod 指定初始化方法。

示例代码:

import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
 
@configuration
public class appconfig {
 
    @bean(initmethod = "init")
    public mybean mybean() {
        return new mybean();
    }
}
 
public class mybean {
    public void init() {
        system.out.println("应用启动后执行: initmethod");
        // 在这里添加初始化逻辑
    }
}

或使用 init-method 属性(xml 配置):

<bean id="mybean" class="com.example.mybean" init-method="init"/>

2.各方式执行时机对比

方法执行时机
@postconstructbean 初始化完成后(属性注入后)
initializingbean与 @postconstruct 类似,属性注入后
applicationrunner应用上下文刷新后,applicationreadyevent 触发前
commandlinerunner同上
applicationlistener应用完全就绪(所有bean初始化完成,所有启动任务执行完毕)

根据需求选择合适的方式:

  • 需要访问数据库或资源时,建议使用 applicationlistener 或 commandlinerunner。
  • 简单的bean初始化逻辑可用 @postconstruct 或 initializingbean。

注意事项

  • 线程问题:默认在主线程执行,避免长时间阻塞操作,可考虑异步执行(如结合 @async)。
  • 依赖注入:在 @postconstruct 和 initializingbean 中无法直接访问其他bean(需等待初始化完成)。
  • 顺序控制:通过 @order 或实现 ordered 接口控制多个启动任务的顺序。

相关文档:spring中initializingbean接口和@postconstruct注解的使用详解

3.使用 @order 控制执行顺序

作用:通过 @order 或实现 ordered 接口控制多个启动任务的执行顺序。

示例:在 applicationrunner 中使用 @order

import org.springframework.boot.applicationrunner;
import org.springframework.core.annotation.order;
import org.springframework.stereotype.component;
 
@component
@order(1)  // 数值越小优先级越高
public class firstrunner implements applicationrunner {
    @override
    public void run(applicationarguments args) {
        system.out.println("第一个执行的 runner");
    }
}
 
@component
@order(2)
public class secondrunner implements applicationrunner {
    @override
    public void run(applicationarguments args) {
        system.out.println("第二个执行的 runner");
    }
}

到此这篇关于springboot启动后自动执行方法的各种方式对比的文章就介绍到这了,更多相关springboot启动自动执行方法内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

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

发表评论

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