SpringBoot启动加载类ApplicationRunner
在springboot启动的过程中会产生一系列事件,我们开发的时候可以自定义一些事件监听处理器.根据自己的需要在针对每个事件做一些业务处理。
springboot 启动的时候会按顺序产生如下几种事件:
1、ApplicationStartingEvent :springboot应用启动且未作任何处理(除listener注册和初始化)的时候发送ApplicationStartingEvent
2、ApplicationEnvironmentPreparedEvent:确定springboot应用使用的Environment且context创建之前发送这个事件
3、ApplicationPreparedEvent:context已经创建且没有refresh发送个事件
4、ApplicationStartedEvent:context已经refresh且application and command-line runners(如果有) 调用之前发送这个事件
5、ApplicationReadyEvent://application and command-line runners (如果有)执行完后发送这个事件,此时应用已经启动完毕.这个事件比较常用,常常在系统启动完后做一些初始化操作
6、ApplicationFailedEvent:应用启动失败后产生这个事件
使用
定义一个类SimosApplicationRunner实现ApplicationRunner接口,然后Override这个ApplicationRunner接口的run方法,就搞定了.代码如下:
@Component
public class ApplicationDatabaseRunner implements ApplicationRunner {
@Autowired
DataSourceBusinessService dataSourceBusinessService;
@Autowired
DataSource dataSource;
@Autowired
DynamicDataSourceCreator dynamicDataSourceCreator;
@Override
public void run(ApplicationArguments args) throws Exception {
DataSource dataSourceAdd = null;
DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
List<IscFunctionDatasourceInfo> list = dataSourceBusinessService.list();
//创建数据源并加入资源池列表中
for (IscFunctionDatasourceInfo info : list) {
DataSourceProperty dataSourceProperty = new DataSourceProperty();
dataSourceProperty.setDriverClassName(info.getDriverClassName());
dataSourceProperty.setPassword(info.getPassword());
dataSourceProperty.setPollName(info.getDsName());
dataSourceProperty.setUsername(info.getUserName());
dataSourceProperty.setUrl(info.getUrl());
try {
dataSourceAdd = dynamicDataSourceCreator.createDataSource(dataSourceProperty);
} catch (Exception e) {
e.getMessage();
}
ds.addDataSource(dataSourceProperty.getPollName(), dataSourceAdd);
}
}
}
注意
如果有多个实现类,而你需要他们按一定顺序执行的话,可以在实现类上加上@Order注解。@Order(value=整数值)。SpringBoot会按照@Order中的value值从小到大依次执行。