背景
在项目中,会遇到如下情况,即需要在 Tomcat 启动时去执行一些操作,首先我们想到的是继承 ServletContextListener,然后在 contextInitialized 加入需要执行的操作,这是一种方法;那么对于 Spring 项目来说,也可以继承 InitialzationBean 来实现,在初始化 bean 和销毁 bean 的时候执行某个方法,由于 ServletContextListener 需要在 web.xml 中进行配置,而且可能要注入其他 bean,所以笔者选择了继承 InitialzationBean 来实现。
遇到的坑
新建一个类,继承 InitialzationBean,代码如下:
importorg.springframework.beans.factory.InitializingBean;importorg.springframework.stereotype.Component;@ComponentpublicclassDoOnStartimplementsInitializingBean{@OverridepublicvoidafterPropertiesSet()throwsException{ System.out.println("xxxxxxxx"); }}
本以为这样就 OK 了,启动 Tomcat 后发现,afterPropertiesSet 方法被执行了两次,奇怪,难道 Spring 会初始化两次 Bean?带着这种猜测,又进行了如下验证:
importorg.springframework.beans.BeansException;importorg.springframework.beans.factory.InitializingBean;importorg.springframework.context.ApplicationContext;importorg.springframework.context.ApplicationContextAware;importorg.spr