实际工作中如果需要在项目启动时做一些初始化的操作,可以通过 实现 ApplicationRunner 或者 CommandLineRunner 两个接口 来进行一些初始化的操作。这两个接口的实现,是 在 容器的初始化完成之后做的一些事情。还有一个接口也有类似的功能(监听容器刷新完成扩展点 ApplicationListener<ContextRefreshedEvent>
https://mp.csdn.net/mp_blog/creation/editor/121899283)
使用步骤:
1.在 主启动类的 同包 或者子包 下,新建 类 实现ApplicationRunner 或者 CommandLineRunner 接口,重写 run()方法;
2.使用 @component 注解,让spring 进行管理;
3.如果有多个自定的 runner示例,可以用 @Oreder 来指定加载的顺序
(如果同时存在 ApplicationRunner 和 CommandLineRunner 的实现类, 没有使用@Order 指定 顺序,则 ApplicationRunner 会 先于 CommandLineRunner 被调用运行。)
示例:
ApplicationRunner 的实现:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.util.Set;
@Component
@Order(2)
public class CustomerApplicationRunner implements ApplicationRunner {
private static final Logger LOGGER = LoggerFactory.getLogger(CustomerApplicationRunner.class);
@Autowired
RedisTemplate redisTemplate;
@Override
public void run(ApplicationArguments args) throws Exception {
LOGGER.debug("CustomerApplicationRunner is running ......");
LOGGER.debug("======================================");
LOGGER.debug("======================================");
LOGGER.debug("");
LOGGER.debug("");
LOGGER.debug(redisTemplate.toString());
LOGGER.debug("");
LOGGER.debug("");
LOGGER.debug("======================================");
LOGGER.debug("======================================");
}
}
CommandLineRunner 的实现:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
@Component
@Order(1)
public class CustomerCommandLineRunner implements CommandLineRunner {
private static final Logger LOGGER = LoggerFactory.getLogger(CustomerCommandLineRunner.class);
@Autowired
RedisTemplate redisTemplate;
@Override
public void run(String... args) throws Exception {
LOGGER.debug("=======================CustomerCommandLineRunner=======================");
LOGGER.debug(redisTemplate.toString());
for(String arg : args){
LOGGER.debug("arg is {} ",arg);
}
LOGGER.debug("===============CustomerCommandLineRunner=====================");
}
}
这两个实现类中使用的 @Order注解 指定了先后顺序。
示例1:
package com.example.demo.runners;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
@Component
@Order(2)
public class MyApplicationRunner implements ApplicationRunner {
private static final Logger LOGGER = LoggerFactory.getLogger(MyApplicationRunner.class);
/**
* Callback used to run the bean.
*
* @param args incoming application arguments
* @throws Exception on error
*/
@Override
public void run(ApplicationArguments args) throws Exception {
/**
*args: -Xms2g --abc=123 username=haohb age=38 gender=male
*/
LOGGER.info("服务已启动,执行 MyApplicationRunner ...");
//返回args 里全部的参数内容(-Xms2g --abc=123 username=haohb age=18 gender=male)
LOGGER.info("-----打印全部参数-----");
String[] sourceArgs = args.getSourceArgs();
for (String sourceArg : sourceArgs) {
LOGGER.info(sourceArg);
}
//optionsNames返回 “--abc=123”(用--打前缀的参数)
LOGGER.info("-----options 的 属性内容-----");
Set<String> optionNames = args.getOptionNames();
Iterator<String> iterator = optionNames.iterator();
while (iterator.hasNext()){
String next = iterator.next();
List<String> optionValues = args.getOptionValues(next);
System.out.println(next + "====" +optionValues);
}
//返回args 里的 -Xms2g username=haohb age=38 gender=male
LOGGER.info("-----非 options 的 属性内容-----");
List<String> nonOptionArgs = args.getNonOptionArgs();
nonOptionArgs.forEach(System.out::println);
}
}
/*
org.springframework.boot.SpringApplication.run(java.lang.String...)
-->301 ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
-->315 callRunners(context, applicationArguments);;
-->743 org.springframework.boot.SpringApplication.callRunners
*/
示例2:
package com.example.demo.runners;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Component
@Order(1)
public class MyCommandLineRunner implements CommandLineRunner {
private static final Logger LOGGER = LoggerFactory.getLogger(MyCommandLineRunner.class);
/**
* Callback used to run the bean.
*
* @param args incoming main method arguments
* @throws Exception on error
*/
@Override
public void run(String... args) throws Exception {
LOGGER.info("服务已启动,执行 MyCommandLineRunner ...");
for (int i = 0; i < args.length; i++) {
LOGGER.info(args[i]);
}
}
}
/*
org.springframework.boot.SpringApplication.run(java.lang.String...)
-->301 ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
-->315 callRunners(context, applicationArguments);;
-->743 org.springframework.boot.SpringApplication.callRunners
*/