SpringBoot启动后初始化的几种方式汇总
目录
- 一、静态代码块
- 二、构造方法
- 三、@PostConstruct
- 四、InitializingBean 接口
- 五、 @Bean 注解中的 initMethod
- 六、 CommandLineRunner 接口
- 七、ApplicationRunner 接口
- 八、@EventListener事件
- 九、SmartInitializingSingleton接口
- 十、ApplicationListener接口
- 十一、执行顺序
- 总结
在 Spring Boot 项目中,程序启动后需要做一些初始化的操作,如需要将一些原始数据写入缓存、或者一些资源的加载等。
一、静态代码块
当我们将某个类交给Spring管理的时候,静态代码块是优先执行的,此时可以在代码块中做一些初始化操作,这个无需过多解释。
@Component @Slf4j public class TestDemo { @Value("${netty.port}") private Integer nettyPort; static { log.info("静态代码块执行======"); } }
二、构造方法
构造方法是静态代码块之后执行的,这种方式也无需过多解释。
@Component @Slf4j public class TestDemo { @Value("${netty.pythonport}") private Integer nettyPort; public TestDemo(){ log.info("构造方法执行======配置文件读取:{}", nettyPort); } static { log.info("静态代码块执行======"); } }
三、@PostConstruct
@PostConstruct 注解,它标记的方法会在依赖注入完成后立即被调用。它适用于简单的初始化逻辑,执行顺序较早。
@Component @Slf4j public class MyPostConstructBean { @Value("${netty.port}") private Integer nettyPort; @PostConstruct public void init() { log.info("PostConstruct执行======配置文件读取:{}", nettyPort); } }
四、InitializingBean 接口
实现 InitializingBean 接口并重写 afterPropertijsesSet 方法,它比 @PostConstruct 更具可读性,适合复杂的初始化逻辑。它也是在依赖注入完成后调用,执行顺序与比@jsPostConstruct 要早一些。
@Component @Slf4j public class MyInitializingBean implements InitializingBean { @Value("${netty.port}") private Integer nettyPort; @Override public void afterPropertiesSet() { log.info("InitializingBean接口的afterProperiesSet执行======配置文件读取:{}", nettyPort); } }
五、 @Bean 注解中的 initMethod
@Configuration 配置类中的 @Bean 注解,可以指定 initMethod 属性来定义初始化方法。需要指定初始化方法,它在 @PostConstruct 和 InitializingBean 之后执行。
@Configuration @Slf4j public class MyInitMethod { @Value("${netty.port}") private Integer nettyPort; @Bean(initMethod = "init") public MyTestBean myBean() { return new MyTestBean(); } class MyTestBean { public void init() { log.info("@Bean的initMethod方法执行 ==== 配置文件读取:{}", nettyPort); } } }
六、 CommandLineRunner 接口
实现 CommandLineRunner 接口的类会在 SpringBoot 应用启动完成后执行。它可以接收启动参数。
@Component @Slf4j public class MyCommandLineRunner implements CommandLineRunner { @Value("${netty.port}") private Integer nettyPort; @Override public void run(String... args) { log.info("CommandLineRunner接口的run方法执行======配置文件读取:{}", nettyPort); } }
七、ApplicationRunner 接口
与 CommandLineRunner 类似。
@Component @Slf4j public class MyApplicationRunner implements ApplicationRunner { @Value("${netty.port}") private Integer nettyPort; @Override public void run(ApplicationArguments args) { log.info("ApplicationRunner接口的run方法执行======配置文件读取:{}", nettyPort); } }
八、@EventListener事件
@EventListener 注解,可以在应用启动的某个生命周期阶段执行初始化逻辑。比如监听 ContextRefreshedEvent 事件。它适用于需要在特定生命周期事件发生时执行的初始化逻辑,可以监听各种生命周期事件。
@Component @Slf4j public class MyContextRefreshedListener { @Value("${netty.port}") private Integer nettyPort; @EventListener public void handleContextRefreshed(ContextRefreshjsedEvent event) { log.info("@EventListener监听ContextRefreshedEvent事件执行======配置文件读取:{}", nettyPort); } }
九、SmartInitializingSingleton接口
实现 SmartInitializingSingleton 接口的 afterSingletonsInstantiated 方法,在所有单例 bean 都初始化完成后执行。
@Component @Slf4j public class MySmartInitializingSingleton implements SmartInitializingSingleton { @Value("${netty.port}") private Integer nettyPort; @Override public void afterSingletonsInstantiated() { log.info("SmartInitializingSingleton接口的afterSingletonsInphpstantiated方法执行======配置文件读取:{}", nettyPort); } }
十、ApplicationListener接口
实现 ApplicationListener 接口,可以监听特定的 Spring 事件,如 ApplicationReadyEvent,用于在应用完全启动后执行逻辑。监听各种 Spring 事件,提供灵活的初始化时机。
@Component @Slf4j public class MyApplicationReadyListener implements ApplicationListener<ApplicationReadyEvent> { @Value("${netty.port}") private Integer nettyPort; @Override public void onApplicationEvent(ApplicationReadyEvent event) { log.info("监听ApplicationReadyEvent事件,ApplicationListener接口的onApplicationEvent方法执行======配置文件读取:{}", nettyPort); } }
十一、执行顺序
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。
精彩评论