Skip to content

启动加载

实际应用中,我们会有在项目启动后去加载一些数据或做一些事情这样的需求。使用@Order注解来定义执行顺序,数值越小优先级越高。

方式一:CommandLineRunner

java
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Order(2)
@Component
public class MyStartupRunner implements CommandLineRunner {
 
    @Override
    public void run(String... args) throws Exception {
        System.out.println(">>>>>>>>>>>>>>>服务启动执行,执行加载数据等操作111111111<<<<<<<<<<<<<");
    }
 
}

方式二:ApplicationRunner

java
import com.example.demo.service.ICodeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Order(2)
@Component
public class InitData implements ApplicationRunner {
 
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println(">>>>>>>>>>>>>>>服务启动执行,执行加载数据等操作111111111<<<<<<<<<<<<<");
    }

}

方式三:ApplicationListener

java
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

@Order(2)
@Component
public class RedisDataLoader implements ApplicationListener<ApplicationReadyEvent> {

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        System.out.println(">>>>>>>>>>>>>>>服务启动执行,执行加载数据等操作111111111<<<<<<<<<<<<<");
    }

}

CommandLineRunner、ApplicationRunner、ApplicationListener的区别

CommandLineRunnerApplicationRunner 基本没什么区别,在SpringBoot完全初始化后会陆续执行ApplicationRunner、CommandLineRunner,唯一的区别那就是参数不同。 ApplicationListener略有不同,它是监听事件的处理。在所有Bean处理完成后,会发送一个ContextRefreshedEvent事件。