• Spring Boot项目启动时如何自动执行加载配置文件、初始化数据库连接等操作?
  • 发布于 2个月前
  • 159 热度
    0 评论
前言
在实际工作中,我们经常需要在项目启动时执行一些初始化的操作,例如加载配置文件、初始化数据库连接等。这些操作对于项目的正常运行至关重要,因此需要在项目启动时自动执行。下面介绍几种常见的方法来实现这些初始化操作。

一、监听容器刷新完成扩展点
在Spring框架中,ApplicationListener接口用于监听特定的事件。当某个事件发生时,所有注册到该事件的监听器都会收到通知并作出相应的处理。在Spring框架中,有一些内置的事件类,用于表示不同的生命周期阶段和应用程序状态。以下是一些常见的内置事件:

ApplicationEvent:这是所有事件的基类,所有的自定义事件都应该继承这个类。它提供了一些基本的属性和方法,例如获取事件源、获取事件类型等。
ContextRefreshedEvent:当Spring容器初始化完成时,会触发这个事件。通常在应用程序启动时调用ConfigurableApplicationContext的refresh()方法时触发。
ContextClosedEvent:当Spring容器关闭时,会触发这个事件。通常在应用程序停止时调用ConfigurableApplicationContext的close()方法时触发。
RequestHandledEvent:当一个请求被处理完毕时,会触发这个事件。通常在Web应用程序中使用Spring MVC框架时,当一个请求被处理完毕时,会自动触发这个事件。
ServletRequestHandledEvent:当一个Servlet请求被处理完毕时,会触发这个事件。通常在Web应用程序中使用Spring MVC框架时,当一个Servlet请求被处理完毕时,会自动触发这个事件。
了解上面这些内置事件后,我们可以监听ContextRefreshedEvent在Spring Boot 启动时完成一些操作,代码如下:
@Component
public class SelfApplicationListener implements ApplicationListener<ContextRefreshedEvent>{
    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        System.out.println(contextRefreshedEvent);
        System.out.println("SelfApplicationListener............................");
    }
}
二、SpringBoot的CommandLineRunner接口
CommandLineRunner接口是一个用于执行命令行参数处理的回调接口。当Spring Boot应用程序启动时,它会扫描并注册实现了该接口的类,然后按照定义的顺序执行这些类的run方法。
下面自定义一个实现类,代码如下:
@Component
@Slf4j
public class SelfCommandLineRunner implements CommandLineRunner {

    /**
     * 堆代码 duidaima.com
     * @param args 接收控制台传入的参数
     */
    @Override
    public void run(String... args) throws Exception {
        log.debug("从控制台接收参数>>>>"+ Arrays.asList(args));
    }
}

java -jar demo.jar 1 2 3
以上命令中传入了三个参数,分别是1、2、3,这三个参数将会被run()方法接收到。

源码分析:
SpringBoot加载上下文的入口在org.springframework.context.ConfigurableApplicationContext()这个方法中,如下图:

调用CommandLineRunner在callRunners(context, applicationArguments);这个方法中执行,源码如下图:

三、SpringBoot的ApplicationRunner接口
ApplicationRunner接口是一个用于执行应用程序初始化的回调接口。当Spring Boot应用程序启动时,它会扫描并注册实现了该接口的类,然后按照定义的顺序执行这些类的run方法。

下面自定义一个实现类,代码如下:
@Component
@Slf4j
public class SelfApplicationRunner implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        log.debug("控制台接收的参数:{},{},{}",args.getOptionNames(),args.getNonOptionArgs(),args.getSourceArgs());
    }
}

java -jar demo.jar --version=1.0 1 2 3
源码分析:
和CommandLineRunner一样,同样在callRunners()这个方法中执行,源码如下图:

四、@PostConstruct注解
前三种针对的是容器的初始化完成之后做的一些事情,当Spring容器创建Bean实例后,会调用带有@PostConstruct注解的方法进行初始化操作。
下面自定义一个实现类,代码如下:
@Component
public class MyBean {

    @PostConstruct
    public void init() {
        System.out.println("执行自定义的初始化方法");
        // 在这里可以执行一些初始化操作,例如加载配置文件、初始化数据库连接等
    }
}
五、@Bean注解中指定初始化方法
在SpringBoot中,@Bean注解用于定义一个Bean的创建过程。如果需要在创建Bean时指定初始化方法,可以使用@Bean注解的initMethod属性来指定初始化方法的名称。

下面自定义一个实现类,代码如下:
@Configuration
public class AppConfig {

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

class MyBean{
    public void customInit(){
        System.out.println("执行自定义的初始化方法");
        // 在这里可以执行一些初始化操作,例如加载配置文件、初始化数据库连接等
    }
}
六、 InitializingBean接口
InitializingBean接口是Spring框架中的一个回调接口,用于在Bean实例化后进行一些初始化操作。当一个Bean被Spring容器创建并完成依赖注入后,会调用实现了InitializingBean接口的类的afterPropertiesSet()方法。

下面自定义一个实现类,代码如下:
public class MyBean implements InitializingBean {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("Bean初始化完成,name属性值为:" + name);
    }
}

用户评论