问题:前一段时间在项目中需要在项目初始化的时候,对一些常用数据进行缓存,我的第一反应是监听器,所以使用了java的ServletContextListener全局异常监听器,但是出现了一个问题,就是项目使用的spring,而ServletContextListener监听器是监听的tomcat的启动过程,而不是spring容器,所以使用ServletContextListener导致spring中bean还未初始化成功,便执行了监听器中的缓存,导致空指针异常,所以今天记录一下后面的解决办法!
1.使用spring中的InitializingBean接口,监听spring的启动过程,在spring装载完所有的bean的时候,会自动调用实现InitializingBean的afterPropertiesSet()方法,在里面去调用初始化用的服务或者逻辑就行。 后面再了解的时候又看到了关于InitializingBean和init-method方法在初始化bean的的一些介绍,所以这里就一并记录下。
InitializingBean的afterPropertiesSet和init-method相同点是都是初始化方法使用的,但是这里问题是他们谁先执行?
初始化代码如下
init-method配置
看执行打印结果
可以看到,先执行InitializingBean的afterPropertiesSet方法,而后执行init-method方法,可以从中得出几点总结
1、Spring为bean提供了两种初始化bean的方式,实现InitializingBean接口,实现afterPropertiesSet方法,或者在配置文件中通过init-method指定,两种方式可以同时使用。
2、实现InitializingBean接口是直接调用afterPropertiesSet方法,比通过反射调用init-method指定的方法效率要高一点,但是init-method方式消除了对spring的依赖。
3、如果调用afterPropertiesSet方法时出错,则不调用init-method指定的方法。
以此记录,见证自己的成长,方便自己查阅,不喜勿喷