0


springboot常用启动初始化方法

在日常开发时,我们常常需要 在SpringBoot 应用启动时执行某一些逻辑,如下面的场景:

1、获取一些当前环境的配置或变量;

2、连接某些外部系统,读取相关配置和交互;

3、启动初始化多线程(线程池)。

在sprongboot项目启动初始化加载方式为2类:

  1. ApplicationRunner与CommandLineRunner接口
  2. Spring Bean初始化的构造方法、PostConstruct、init-method、InitializingBean

ApplicationRunner与CommandLineRunner

如果需要在SpringApplication启动时执行一些特殊的代码,你可以实现ApplicationRunner或CommandLineRunner接口,这两个接口工作方式相同,都只提供单一的run方法,而且该方法仅在SpringApplication.run(…)完成之前调用,更准确的说是在构造SpringApplication实例完成之后调用run()的时候。

  • ApplicationRunner
  1. import org.springframework.boot.ApplicationArguments;
  2. import org.springframework.boot.ApplicationRunner;
  3. import org.springframework.stereotype.Component;
  4. @Component
  5. public class ApplicationRunnerInit implements ApplicationRunner {
  6. @Override
  7. public void run(ApplicationArguments args) throws Exception {
  8. System.out.println("执行-->ApplicationRunner");
  9. }
  10. }
  • CommandLineRunner
  1. package com.mtaite.study.mybatis.init;
  2. import org.springframework.boot.CommandLineRunner;
  3. import org.springframework.core.annotation.Order;
  4. import org.springframework.stereotype.Component;
  5. @Component
  6. @Order(1)
  7. public class CommandLineRunnerInit implements CommandLineRunner {
  8. @Override
  9. public void run(String... args) throws Exception {
  10. System.out.println("执行-->CommandLineRunner...");
  11. }
  12. }

Spring Bean初始化的构造方法、PostConstruct、init-method、InitializingBean

  • 构造器注入
  1. package com.mtaite.study.mybatis.init;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.core.env.Environment;
  4. import org.springframework.stereotype.Component;
  5. import java.util.Arrays;
  6. @Component
  7. public class ConstructorBeanInit {
  8. private final Environment environment;
  9. @Autowired
  10. public ConstructorBeanInit(Environment environment) {
  11. //environment实例已初始化
  12. this.environment = environment;
  13. System.out.println("执行实始化-->ConstructorBeanInit"+Arrays.asList(environment.getDefaultProfiles()));
  14. }
  15. }
  • PostConstruct(会在构造方法之后执行)
  1. package com.mtaite.study.mybatis.init;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.core.env.Environment;
  4. import org.springframework.stereotype.Component;
  5. import javax.annotation.PostConstruct;
  6. import java.util.Arrays;
  7. @Component
  8. public class PostConstructBeanInit {
  9. @Autowired
  10. private Environment environment;
  11. @PostConstruct
  12. public void init() {
  13. System.out.println("执行初始化-->PostConstructBeanInit"+Arrays.asList(this.environment.getDefaultProfiles()));
  14. }
  15. }
  • InitializingBean(官方不推荐)
  1. package com.mtaite.study.mybatis.init;
  2. import org.springframework.beans.factory.InitializingBean;
  3. import org.springframework.stereotype.Component;
  4. @Component
  5. public class InitialingzingBeanTest implements InitializingBean {
  6. @Override
  7. public void afterPropertiesSet() throws Exception {
  8. System.out.println("执行初始化-->InitializingBean");
  9. }
  10. }

Bean在实例化的过程中执执行顺序为:Constructor > @PostConstruct > InitializingBean > init-method

InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet()方法。在spring初始化bean的时候,如果bean实现了InitializingBean接口,在对象的所有属性被初始化后之后才会调用afterPropertiesSet()方法。spring初始化bean肯定会在ApplicationRunner和CommandLineRunner接口调用之前。

  • @Bean(initMethod)方法

尽管使用initialingBean接口可以实现初始化动作,但是Sping官方并不建议我们使用InitializingBean接口,因为它将你的代码耦合在Spring代码中,官方的建议是在bean的配置文件指定init-method方法或者在@Bean中设置init-method属性。

  1. public class InitMethodBean {
  2. @Autowired
  3. private Environment environment;
  4. public void init() {
  5. System.out.print("执行初始化-->"+Arrays.asList(environment.getDefaultProfiles()));
  6. }
  7. }
  1. @Bean(initMethod="init")
  2. public InitMethodBean exBean() {
  3. return new InitMethodBean();
  4. }

Springboot初始化的顺序为总结

  1. 构造器方法
  2. @PostConstruct 注解方法
  3. InitializingBean的afterPropertiesSet()
  4. Bean定义的initMethod属性方法
  5. CommandLineRunner
  6. ApplicationRunner

标签: mybatis java spring

本文转载自: https://blog.csdn.net/lzzyok/article/details/128539264
版权归原作者 lzzyok 所有, 如有侵权,请联系我们删除。

“springboot常用启动初始化方法”的评论:

还没有评论