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

2025-05-14 04:38:18 169
魁首哥

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 {
    @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 配置):


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启动自动执行方法内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

分享
海报
169
上一篇:Java中如何将JSON格式的字符串转换为Map 下一篇:Jetpack Room 使用示例详解

忘记密码?

图形验证码