SpringBoot启动加载类ApplicationRunner

2021-09-08  本文已影响0人  Neil_Wong

在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值从小到大依次执行。

上一篇下一篇

猜你喜欢

热点阅读