一光年

[Spring-Mvc] Bean被重复加载的原因

2019.08.22

最近帮朋友忙做了一功能,在一个老系统上添加简单的IM功能。

老系统用的是SpringMvc,采用传统xml配置。用惯了SpringBoot,对这种配置还是比较发怵的。

果然,在启动Websocket服务时,发现了一个奇怪的问题:Websocket服务启动了两次。在第二次启动时,系统报了以下错误:

Address already in use

显然是端口被占用了。

出现这种问题,意味着Websocket服务对应的Bean被加载了两次,调用了两次init方法。导致的原因可能有两个:

  1. 这个Bean被重复定义了
  2. 配置xml文件被加载了两次

经过仔细排查,Spring定义XML文件中并不存在重复定义的问题。果然,在web.xml中,该xml被加载了两次。

至于之前不报错的原因,大概是都没有声明init方法或重复调用也没有抢占系统资源吧。