SpringBoot项目启动时自动执行代码的几种方式

18 篇文章 0 订阅
18 篇文章 0 订阅
项目启动自动执行代码方式

SpringBoot项目在启动的时候需要预加载一些资源。

如何实现启动过程中执行代码,或启动成功后自动执行代码?

  • 在static代码块中实现
  • 在构造方法里实现
  • 使用@PostConstruct注解实现
  • 也可以实现Spring的ApplicationRunnerCommandLineRunner接口去实现启动后运行的功能。

java自身的启动时加载方式

  • static代码块:static静态代码块,在类加载的时候即自动执行。

  • 构造方法:在对象初始化时执行。执行顺序在static静态代码块之后。

Spring启动时加载方式

  • @PostConstruct注解:@PostConstruct注解使用在方法上,这个方法在对象依赖注入初始化之后执行。

  • ApplicationRunnerCommandLineRunner:SpringBoot提供了两个接口来实现Spring容器启动完成后执行的功能,两个接口分别为CommandLineRunnerApplicationRunner。这两个接口需要实现一个run方法,将代码在run中实现即可。

这两个接口功能基本一致,其区别在于run方法的入参。ApplicationRunnerrun方法入参为ApplicationArguments,而CommandLineRunnerrun方法入参为String[]数组。

何为ApplicationArguments

在Spring应用运行时使用的访问应用参数。即我们可以获取到SpringApplication.run(…)的应用参数。

Order注解:

当有多个类实现了CommandLineRunnerApplicationRunner接口时,可以通过在类上添加@Order注解来设定运行顺序。

/**
 * 测试加载顺序
 */
@Component
public class TestPostConstruct {

    static {
        System.out.println("static代码块。。。");
    }
    
    public TestPostConstruct() {
        System.out.println("constructer构造函数。。。");
    }

    @PostConstruct
    public void init() {
        System.out.println("@PostConstruct注解。。。");
    }
}

TestApplicationRunner实现ApplicationRunner接口

@Component
@Order(1) // 加载顺序 1
public class TestApplicationRunner implements ApplicationRunner{
    @Override
    public void run(ApplicationArguments applicationArguments) throws Exception {
        System.out.println("order1:实现ApplicationRunner接口。。。");
    }
}

TestCommandLineRunner实现CommandLineRunner接口

@Component
@Order(2) // 加载顺序 2
public class TestCommandLineRunner implements CommandLineRunner {
    @Override
    public void run(String... strings) throws Exception {
        System.out.println("order2:实现CommandLineRunner接口。。。");
    }
}

执行结果:

static:静态代码块最先执行

constructer:构造方法是在static后执行

@PostConstruct:该注解是在静态代码块和构造方法之后执行

实现ApplicationRunnerCommandLineRunner接口的类的执行顺序由@Order注解控制。

小结:

Spring应用启动过程中,首先要自动扫描有@Component注解的类,加载类并初始化对象进行自动注入。

  • static:加载类时首先要执行static静态代码块中的代码
  • constructer:之后再初始化对象时会执行构造方法
  • @PostConstruct:在对象注入完成后,调用带有@PostConstruct注解的方法。
  • 接口:当容器启动成功后,再根据@Order注解的顺序调用CommandLineRunnerApplicationRunner接口类中的run方法。

加载顺序:static>constructer>@PostConstruct>CommandLineRunnerApplicationRunner

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值