Spring实现启动完成后,加载数据

有时在spring项目启动完成之后,需要预加载一些数据,如一些系统变量,或者大对象之类的。这时候,就需要用到spring的ApplicationListener。

ApplicationListener接口与抽象类ApplicationEvent类配合来完成ApplicationContext的事件机制。当容器中存在实现ApplicationListener接口的Bean,ApplicationContext调用publishEvent方法时,对应的Bean会被触发。

1、Spring源码

在Spring源码中,可以看到run方法中,最后一步会对实现了ApplicationListener接口的类进行处理。

Spring实现启动完成后,加载数据插图

2、定义实现类

/**
 * 监听器,在项目中遇到一个ApplicationListener,
 * 在容器初始化完成后,有一些操作需要处理一下,
 * 比如数据的加载、初始化缓存、特定任务的注册等,此时可以使用这个监听器
 */@Slf4j
public class InitListener implements ApplicationListener<ContextRefreshedEvent> {

    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        try {
            log.info("-----look at here ,after the application has started,this method will be proceed.");
            log.info("get local ip is :" + InetAddress.getLocalHost().getHostAddress());
        } catch (UnknownHostException e) {
            e.printStackTrace();
            log.error("occur a exception!");
        }
    }
}

3、Listener注册

将Listener注册到对应的上下文中:

@Configuration
public class ListenerConfig {

    @Bean
    public InitListener startupListener() {
        return new InitListener();
    }
}

这样就可以在springApplication中加载完成后,去调用spring的各种bean完成预加载等业务逻辑。

发表评论