spring初始化功能实现方式

Spring初始化功能实现方式

在 Spring 应用中,启动完成后初始化部分功能是一个常见需求。以下是几种实现方式:


1. 使用 @PostConstruct 注解

  • 说明@PostConstruct 是 JSR-250 提供的注解,标记的方法会在 Bean 初始化完成后执行。
  • 适用场景:适用于单个 Bean 的初始化逻辑。
  • 示例:java复制
@Component
public class MyInitializer {

    @PostConstruct
    public void init() {
        System.out.println("Bean 初始化完成后执行");
    }
}

2. 实现 InitializingBean 接口

  • 说明:Spring 提供了 InitializingBean 接口,实现其 afterPropertiesSet() 方法,该方法会在 Bean 属性设置完成后执行。
  • 适用场景:适用于需要依赖注入完成后执行的初始化逻辑。
  • 示例:java复制
@Component
public class MyInitializer implements InitializingBean {

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("Bean 属性设置完成后执行");
    }
}

3. 使用 @EventListener 监听 ContextRefreshedEvent 事件

  • 说明:Spring 容器启动完成后会发布 ContextRefreshedEvent 事件,可以通过监听该事件执行初始化逻辑。
  • 适用场景:适用于需要在整个应用启动完成后执行的初始化逻辑。
  • 示例:java复制
@Component
public class MyInitializer {

    @EventListener(ContextRefreshedEvent.class)
    public void onApplicationEvent(ContextRefreshedEvent event) {
        System.out.println("Spring 容器启动完成后执行");
    }
}

4. 实现 ApplicationRunner 接口

  • 说明:Spring Boot 提供了 ApplicationRunner 接口,实现其 run() 方法,该方法会在应用启动完成后执行。
  • 适用场景:适用于需要在 Spring Boot 应用启动完成后执行的初始化逻辑。
  • 示例:java复制
@Component
public class MyInitializer implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("Spring Boot 应用启动完成后执行");
    }
}

5. 实现 CommandLineRunner 接口

  • 说明:与 ApplicationRunner 类似,CommandLineRunner 接口的 run() 方法也会在应用启动完成后执行,但参数为字符串数组。
  • 适用场景:适用于需要在 Spring Boot 应用启动完成后执行的初始化逻辑。
  • 示例:java复制
@Component
public class MyInitializer implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        System.out.println("Spring Boot 应用启动完成后执行");
    }
}

6. 使用 SmartLifecycle 接口

  • 说明SmartLifecycle 是 Spring 提供的一个生命周期接口,可以控制 Bean 的启动和关闭顺序。
  • 适用场景:适用于需要精确控制初始化顺序的场景。
  • 示例:java复制
@Component
public class MyInitializer implements SmartLifecycle {

    private boolean running = false;

    @Override
    public void start() {
        System.out.println("自定义初始化逻辑");
        running = true;
    }

    @Override
    public void stop() {
        System.out.println("自定义销毁逻辑");
        running = false;
    }

    @Override
    public boolean isRunning() {
        return running;
    }
}

7. 使用 @BeaninitMethod 属性

  • 说明:在 @Bean 注解中指定 initMethod 属性,Spring 会在 Bean 初始化完成后调用该方法。
  • 适用场景:适用于需要在 Bean 初始化完成后执行的逻辑。
  • 示例:java复制
@Configuration
public class MyConfig {

    @Bean(initMethod = "init")
    public MyBean myBean() {
        return new MyBean();
    }
}

public class MyBean {

    public void init() {
        System.out.println("Bean 初始化完成后执行");
    }
}

8. 使用 @EventListener 监听 ApplicationReadyEvent 事件

  • 说明:Spring Boot 提供了 ApplicationReadyEvent 事件,表示应用已完全启动并准备好接收请求。
  • 适用场景:适用于需要在应用完全启动后执行的初始化逻辑。
  • 示例:java复制
@Component
public class MyInitializer {

    @EventListener(ApplicationReadyEvent.class)
    public void onApplicationReady(ApplicationReadyEvent event) {
        System.out.println("Spring Boot 应用完全启动后执行");
    }
}

总结

  • 单个 Bean 初始化@PostConstructInitializingBean@BeaninitMethod
  • 应用启动完成后初始化ApplicationRunnerCommandLineRunnerContextRefreshedEventApplicationReadyEvent
  • 复杂场景SmartLifecycle

根据具体需求选择合适的方式,确保初始化逻辑在正确的时机执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我睡觉的时候一点都不困

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值