SpringBoot的启动监听ApplicationRunner
有时我们需要在SpringBoot启动成功后,执行一些回调方法。一般用于资源的初始化或者其他的的服务启动。
CommandLineRunner 和 ApplicationRunner
这是由SpringBoot提供的两个监听接口。由程序实现,并且标识@Component注解,交于IOC管理。在SpringBoot启动成功后就会执行实现类的回调.
优先级的控制
如果一个项目存在多个CommandLineRunner或者ApplicationRunner的实现。可以通过@Order注解来设置执行的优先级。value值越小,越先执行。
//工具类上使用@Component注解
package com.yunque.www.springbootdemo.utils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class BeanUtils implements ApplicationContextAware {
private static ApplicationContext ac;
@Override
public void setApplicationContext(ApplicationContext ac) throws BeansException {
this.ac = ac;
String[] bean = ac.getBeanDefinitionNames();
System.err.println("------------------------------------>");
for (int i = 0; i < bean.length; i++) {
System.err.println(bean[i]);
}
System.err.println("------------------------------------>");
//ApplicationContext Spring ioc容器
//ApplicationContextAware 有ApplicationContext的引用
}
/**
* 通过名称获取bean
*
* @param name
* @return
*/
public static Object getBean(String name) {
return ac.getBean(name);
}
/**
* 通过class获取bean
* @param zClass
* @return
*/
//public static Object getBean(Class zClass){
// return ac.getBean(zClass);
//}
/**
* 通过class获取bean
*
* @param zClass
* @param <T>
* @return
*/
public static <T> T getBean(Class<T> zClass) {
return ac.getBean(zClass);
}
/**
* 通过名称获取指定类型的bean
*
* @param name
* @param zClass
* @return
*/
public static Object getBean(String name, Class zClass) {
return ac.getBean(name, zClass);
}
}
package com.yunque.www.springbootdemo.run;
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;
/**
* 在容器启动的时候执行一些内容。比如读取配置文件,数据库连接之类的。
* 容器启动完成的时候。
*
*/
@Component
@Order(1)
public class AfterStartedApplicationRunner implements ApplicationRunner {
public Logger logger= LoggerFactory.getLogger(this.getClass());
@Override
public void run(ApplicationArguments args) throws Exception {
logger.info(args.toString());
logger.info("测试启动完成监听");
}
}