先看CommandLineRunner接口的API:
import org.springframework.core.annotation.Order; public interface CommandLineRunner { /** * Callback used to run the bean. * @param args incoming main method arguments * @throws Exception on error */ void run(String... args) throws Exception; }
平常开发中有可能需要实现在项目启动后执行的功能,SpringBoot提供的一种简单的实现方案就是添加一个model并实现CommandLineRunner接口,实现功能的代码放在实现的run方法中。
ex:
import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; @Component public class StartupRunner implements CommandLineRunner{ @Override public void run(String... args) throws Exception { System.out.println(">>>>>>>>>>>>>>>服务启动执行,执行加载数据等操作<<<<<<<<<<<<<"); } }
启动截图示例:
如果有多个类实现CommandLineRunner接口,如何保证顺序:
SpringBoot在项目启动后会遍历所有实现CommandLineRunner的实体类并执行run方法,如果需要按照一定的顺序去执行,那么就需要在实体类上使用一个@Order注解【 @Order(value=1..)】(或者实现Order接口)来表明顺序.
ex1:
import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @Component @Order(value=1) public class StartupRunnerOne implements CommandLineRunner{ @Override public void run(String... args) throws Exception { System.out.println(">>>>>>>>>>>>>>>服务启动第一个开始执行的任务,执行加载数据等操作<<<<<<<<<<<<<"); } }
ex2:
import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @Component @Order(value=2) public class StartupRunnerTwo implements CommandLineRunner{ @Override public void run(String... args) throws Exception { System.out.println(">>>>>>>>>>>>>>>服务第二顺序启动执行,执行加载数据等操作<<<<<<<<<<<<<"); } }
上面两个类的示例代码,启动后执行顺序看截图: