springBoot启动时自动执行指定的方法的五种实现方式

本文详细介绍在SpringBoot项目启动时执行特定任务的五种方法,包括实现ApplicationRunner和CommandLineRunner接口,使用@PostConstruct注解,实现ServletContextListener接口,以及实现ServletContextAware接口并重写setServletContext方法。

在springBoot中我们有时候需要让项目在启动时提前加载相应的数据到缓存中或者执行某个方法,那么实现提前加载的方式有哪些呢?接下来我带领大家逐个解答

一、实现ApplicationRunner接口

/**
     * 用于指示bean包含在SpringApplication中时应运行的接口。可以定义多个applicationrunner bean
     * 在同一应用程序上下文中,可以使用有序接口或@order注释对其进行排序。
     */
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("ApplicationRunner的run方法");
    }

获取 ApplicationArguments中的参数可以参考: SpringBoot中的ApplicationArguments的介绍以及其使用

二、实现CommandLineRunner接口

/**
     * 用于指示bean包含在SpringApplication中时应运行的接口。可以在同一应用程序上下文中定义多个commandlinerunner bean,并且可以使用有序接口或@order注释对其进行排序。
     * 如果需要访问applicationArguments而不是原始字符串数组,请考虑使用applicationrunner。
     * 
     */
    @Override
    public void run(String... ) throws Exception {
        System.out.println("CommandLineRunner的run方法");
    }

三、将要执行的方法所在的类交个spring容器扫描(@Component),并且在要执行的方法上添加@PostConstruct注解或者静态代码块执行

@Component
public class Test2 {
    //静态代码块会在依赖注入后自动执行,并优先执行
    static{
        System.out.println("---static--");
    }
    /**
     *  @Postcontruct’在依赖注入完成后自动调用
     */
    @PostConstruct
    public static void haha(){
        System.out.println("@Postcontruct’在依赖注入完成后自动调用");
    }
}

四、实现ServletContextListener接口


/**
     * 在初始化Web应用程序中的任何过滤器或servlet之前,将通知所有servletContextListener上下文初始化。
     */
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        //ServletContext servletContext = sce.getServletContext();
        System.out.println("执行contextInitialized方法");
    }

五、实现ServletContextAware接口并重写其setServletContext方法

@Component
public class TestStarted implements ServletContextAware {
    /**
     * 在填充普通bean属性之后但在初始化之前调用
     * 类似于initializingbean的afterpropertiesset或自定义init方法的回调
     *
     */
    @Override
    public void setServletContext(ServletContext servletContext) {
        System.out.println("setServletContext方法");
    }
}

注意:该方法会在填充完普通Bean的属性,但是还没有进行Bean的初始化之前执行

Spring Boot启动类中编写的方法**不会自动执行**,除非这些方法被特定的机制触发。Spring Boot启动类本质上是一个普通的Java类,其中的`main`方法用于启动Spring Boot应用。如果希望在应用启动时自动执行某些方法,必须借助Spring Boot提供的启动执行机制。 ### 启动类中普通方法不会自动执行 启动类中的普通方法(如自定义的初始化方法)不会随着应用的启动自动运行,除非通过以下方式显式调用或触发: - 在`main`方法中手动调用。 - 通过Spring Boot提供的启动执行接口(如`ApplicationRunner`或`CommandLineRunner`)进行注册。 - 使用`@PostConstruct`注解。 - 利用静态代码块。 ### 可实现自动执行方式 #### 1. 实现 `ApplicationRunner` 接口 通过实现 `ApplicationRunner` 接口,并将其交由Spring容器管理(如使用`@Component`注解),可以在Spring Boot启动完成后自动执行指定逻辑。 ```java import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @Component @Order(1) public class MyApplicationRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { System.out.println("ApplicationRunner 执行初始化逻辑"); } } ``` 这种方式可以控制执行顺序,并适用于多个初始化任务的场景[^3]。 #### 2. 使用 `@PostConstruct` 注解 `@PostConstruct` 注解用于在Bean初始化阶段执行方法,适用于依赖注入完成后执行的初始化逻辑。 ```java import javax.annotation.PostConstruct; import org.springframework.stereotype.Component; @Component public class MyPostConstruct { @PostConstruct public void init() { System.out.println("@PostConstruct 执行初始化逻辑"); } } ``` 该方法在Bean构造完成后自动执行,但早于`ApplicationRunner`的执行时机[^4]。 #### 3. 静态代码块 静态代码块会在类加载时执行,因此可以在Spring Boot启动时自动运行。 ```java import org.springframework.stereotype.Component; @Component public class StaticBlock { static { System.out.println("静态代码块在类加载时执行"); } } ``` 这种方式适用于简单的初始化逻辑,但不推荐用于复杂的业务场景[^4]。 #### 4. 在 `main` 方法中显式调用 如果希望启动类中的方法在应用启动时运行,可以在 `main` 方法中显式调用。 ```java @SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); System.out.println("主方法中显式调用"); } } ``` 虽然可以实现自动执行,但这种方式缺乏Spring上下文的支持,适用于简单的控制台输出或非Spring依赖的逻辑。 ### 总结 Spring Boot启动类中的方法默认不会随着应用启动自动执行,除非通过Spring Boot提供的启动执行机制(如`ApplicationRunner`、`@PostConstruct`、静态代码块等)进行注册或触发。这些机制确保了应用启动时的初始化逻辑能够按需执行,同时支持执行顺序的控制和上下文依赖的注入。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值