Spring中的InitializingBean接口的使用

问题:前一段时间在项目中需要在项目初始化的时候,对一些常用数据进行缓存,我的第一反应是监听器,所以使用了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相同点是都是初始化方法使用的,但是这里问题是他们谁先执行?

初始化代码如下


QQ图片20181009122728.png

init-method配置


QQ图片20181009122948.png

看执行打印结果


QQ图片20181009123106.png

可以看到,先执行InitializingBean的afterPropertiesSet方法,而后执行init-method方法,可以从中得出几点总结

1、Spring为bean提供了两种初始化bean的方式,实现InitializingBean接口,实现afterPropertiesSet方法,或者在配置文件中通过init-method指定,两种方式可以同时使用。

2、实现InitializingBean接口是直接调用afterPropertiesSet方法,比通过反射调用init-method指定的方法效率要高一点,但是init-method方式消除了对spring的依赖。

3、如果调用afterPropertiesSet方法时出错,则不调用init-method指定的方法。

以此记录,见证自己的成长,方便自己查阅,不喜勿喷

你可能感兴趣的:(Spring中的InitializingBean接口的使用)