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

2、定义实现类
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 | /** * 监听器,在项目中遇到一个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注册到对应的上下文中:
1 2 3 4 5 6 7 8 | @Configuration public class ListenerConfig { @Bean public InitListener startupListener() { return new InitListener(); } } |
这样就可以在springApplication中加载完成后,去调用spring的各种bean完成预加载等业务逻辑。