SpringBoot 启动项目后执行方法的几种方式

SpringBoot项目启动后初始化执行方法

在项目开发中某些场景必须要用到启动项目后立即执行方式的功能,如我们需要去初始化数据到redis缓存、设置策略工厂,或者启动后读取相应的配置等,主要聊聊实现立即执行的几种方法。

一、CommandLineRunner

二、 ApplicationRunner

这两者的实现方法一样,都是去继承相应的接口然后重写run方法即可,也都是SpringBoot框架所提供给我们的接口,也是项目中最常用的,比较灵活,有多个CommandLineRunnerApplicationRunner实现类时可以通过@Order注解或实现Ordered接口重写getOrder方法实现按指定顺序执行。

@Order(1) //通过order注解指定执行顺序
@Component
public class CommandLineRunnerInit implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        System.out.println("CommandLineRunner 启动后执行方法...");
    }
}

ApplicationRunner 通过order注解指定执行顺序

@Order(2) //通过order注解指定执行顺序
@Component
public class ApplicationRunnerInit implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("ApplicationRunner 启动后执行方法...");
    }
}

ApplicationRunner 通过实现 Ordered 指定执行顺序

@Component
// 通过实现 Ordered 指定执行顺序
public class ApplicationRunnerInit implements ApplicationRunner, Ordered {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("ApplicationRunner 启动后执行方法...");
    }

    @Override
    public int getOrder() {
       return 0;
    }
}

这两者的不同其实就是run方法中所接收的参数类型不同,CommandLineRunner是对我们启动jar包时所传参数不进行处理,原样返回String类型给你,ApplicationRunner是封装成了ApplicationArguments参数,通过这个类型可以更方便的判断某些参数是否存在之类的。

二、JDK提供的@PostConstruct

@PostConstruct是JDK所提供的注解,使用该注解的方法会在服务器加载Servlet的时候运行。也可以在一个类中写多个方法并添加这个注解。

@Component
public class PostConstructTest {

    @PostConstruct
    public void inti1() {
        System.out.println("@PostConstruct 方法1执行...");
    }

    @PostConstruct
    public void inti2() {
        System.out.println("@PostConstruct 方法2执行...");
    }
}

三、其他方法

3.1 ApplicationContextAware

ApplicationContextAware 一般被用来获取applicationContext上下文信息,并且也可以启动时被执行

@Component
public class ApplicationContextAwareTest implements ApplicationContextAware {

    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
        System.out.println("ApplicationContextAware 方法执行...");
    }
}

3.2 ApplicationListener

ApplicationListener 事件监听,启动会执行多个监听器【会多次执行】,具体可了解Springboot服务启动过程。

@Component
public class ApplicationListenerTest implements ApplicationListener {
    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        System.out.println("ApplicationListener 方法执行...");
    }
}

3.3 InitializingBean

InitializingBean 初始化启动后方法执行

@Component
public class InitializingBeanInit implements InitializingBean {
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("InitializingBean 方法执行...");
    }
}

四、总结

以上多种初始执行方法日志输出为:

ApplicationContextAware 方法执行...
InitializingBean 方法执行...
    
@PostConstruct 方法1执行...
@PostConstruct 方法2执行...

ApplicationListener 方法执行...
ApplicationListener 方法执行...
ApplicationListener 方法执行...
ApplicationListener 方法执行...
    
ApplicationRunner 启动后执行方法...
CommandLineRunner 启动后执行方法...
    
ApplicationListener 方法执行...
ApplicationListener 方法执行...

存在多个ApplicationRunner、CommandLineRunner可以通过order指定其执行顺序,但其执行顺序没有ApplicationContextAware等高。但一般生产中使用ApplicationRunner、CommandLineRunner,因为其更加灵活。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值