文章内容
有时在spring项目启动完成之后,需要预加载一些数据,如一些系统变量,或者大对象之类的。这时候,就需要用到spring的ApplicationListener。
ApplicationListener接口与抽象类ApplicationEvent类配合来完成ApplicationContext的事件机制。当容器中存在实现ApplicationListener接口的Bean,ApplicationContext调用publishEvent方法时,对应的Bean会被触发。
1、Spring源码
在Spring源码中,可以看到run方法中,最后一步会对实现了ApplicationListener接口的类进行处理。
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完成预加载等业务逻辑。