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. 使用 @Bean
的 initMethod
属性
- 说明:在
@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 初始化:
@PostConstruct
、InitializingBean
、@Bean
的initMethod
。 - 应用启动完成后初始化:
ApplicationRunner
、CommandLineRunner
、ContextRefreshedEvent
、ApplicationReadyEvent
。 - 复杂场景:
SmartLifecycle
。
根据具体需求选择合适的方式,确保初始化逻辑在正确的时机执行。