使用@PostConstruct注解
@PostConstruct注解可以用于在Spring容器初始化bean之后立即执行特定方法
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
public class MyInitializer {
@PostConstruct
public void init() {
// 初始化工作
System.out.println("初始化工作完成");
}
}
实现Application Runner接口
ApplicationRunner接口提供了一种在Spring Boot应用启动后执行特定代码的方式
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("初始化工作完成");
}
}
实现Command Line Runner接口
CommandLineRunner接口类似于ApplicationRunner,可以在应用启动之后执行特定代码
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("初始化工作完成");
}
}
使用@Event Listener注解监听ApplicationReadyEvent
通过监听ApplicationReadyEvent事件,可以在Spring Boot应用完全启动并准备好服务请求时执行初始化工作
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import org.springframework.boot.context.event.ApplicationReadyEvent;
@Component
public class MyApplicationReadyListener {
@EventListener(ApplicationReadyEvent.class)
public void onApplicationReady() {
// 初始化工作
System.out.println("初始化工作完成");
}
}
使用SmartInitializingSingleton接口
SmartInitializingSingleton接口提供了一种在所有单例bean初始化完成后执行代码的方式
import org.springframework.beans.factory.SmartInitializingSingleton;
import org.springframework.stereotype.Component;
@Component
public class MySmartInitializingSingleton implements SmartInitializingSingleton {
@Override
public void afterSingletonsInstantiated() {
// 初始化工作
System.out.println("初始化工作完成");
}
}
使用SPring Boot的InitializingBean接口
通过实现InitializingBean接口的afterPropertiesSet方法,可以在bean的属性设置完成后执行初始化工作
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("初始化工作完成");
}
}
总结
- @PostConstruct:适合简单的初始化逻辑,执行时机较早
- ApplicationRunner 和 CommandLineRunner:适合需要访问命令行参数的初始化逻辑,执行时机在 Spring Boot 应用启动完成后
- ApplicationReadyEvent 监听器:适合在整个应用准备好后执行的初始化逻辑
- SmartInitializingSingleton:适合需要在所有单例 bean 初始化完成后执行的初始化逻辑
- InitializingBean:适合需要在 bean 属性设置完成后执行的初始化逻辑