ApplicationListener接口中的onApplicationEvent被调用两次解决方案

Spring容器初始化完成后,调用BeanPostProcessor这个类,这个类实现ApplicationListener接口,重写onApplicationEvent方法,

方法中就是我们自己要在容器初始化完成后加载的数据或者缓存。

下面是XML配置:


下面是自己写的BeanPostProcessor类:


下面是启动Tomcat后,重复加载了数据,调用了两次onApplicationEvent方法:


蓝色部分中的:


Root WebApplicationContext和WebApplicationContext(spring-servlet)两个容器。

下面是初始化全国地区信息的时候加载了两次:


Returning JDBC Connection to DataSource前面已经加载了一次地区信息,然后又Fetching JDBC Connection from DataSource又加载了一次。

问了度娘:虽然有方法,但试过以后还是没有解决这个问题。

方法一:

在onApplicationEvent()方法中添加判断,

==null,然后判断里面执行你要初始化的或者是缓存的代码。

方法二:


字符串值比较equals("Root WebApplicationContext")。

方法三:


在事件参数前面加上final,  final ContextRefreshedEvent event。

最终暂时还是没有解决问题,也许可以解决大家的这个问题,先写下来。


都过去一年了,编辑下,问题是配置文件中一个内容被加载了两次,需要使用<init-param>将其放在<bean>内部。问题解决。


  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
onApplicationEvent是一个方法,用于处理Spring应用程序的事件。在这个方法,我们可以根据不同的事件类型执行相应的逻辑。在引用\[1\]的代码示例onApplicationEvent方法的逻辑是判断事件类型,并根据不同的事件类型执行相应的处理。例如,如果事件是ApplicationStartingEvent,则会输出"处理ApplicationStartingEvent"。如果事件是ApplicationReadyEvent,则可以执行启动成功后的逻辑。\[1\] 在引用\[2\]的代码示例,我们可以看到onApplicationEvent方法被执行了两次,分别对应两个不同的ApplicationEventListener对象。第一个对象先执行了ApplicationStartingEvent事件,然后第二个对象执行了Application整个生命周期的5个事件,最后第一个对象执行了剩下的4个事件。这个执行顺序是根据事件的触发顺序来确定的。\[2\] 在引用\[3\]的代码示例,我们可以看到一个实现了ApplicationListener接口的ApplicationEventListener类。在这个类,通过重写onApplicationEvent方法来处理不同的事件。例如,如果事件是ApplicationStartingEvent,则会处理该事件。\[3\] 总结来说,onApplicationEvent方法是用来处理Spring应用程序的事件的,我们可以根据不同的事件类型执行相应的逻辑。在引用\[1\]的代码示例onApplicationEvent方法根据事件类型输出不同的信息。在引用\[2\]的代码示例,我们可以看到onApplicationEvent方法被执行了两次,分别对应两个不同的ApplicationEventListener对象。在引用\[3\]的代码示例,我们可以看到一个实现了ApplicationListener接口的ApplicationEventListener类,通过重写onApplicationEvent方法来处理不同的事件。 #### 引用[.reference_title] - *1* *2* *3* [Spring事件处理——onApplicationEvent执行两次.md](https://blog.csdn.net/u014453515/article/details/85268526)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值