美文网首页
SpringBoot启动加载类ApplicationRunner

SpringBoot启动加载类ApplicationRunner

作者: Neil_Wong | 来源:发表于2021-09-08 19:40 被阅读0次

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

    相关文章

      网友评论

          本文标题:SpringBoot启动加载类ApplicationRunner

          本文链接:https://www.haomeiwen.com/subject/xqtbwltx.html