Spring Boot学习笔记(七)Spring 中 InitializingBean 作用(如何在项目初始化时对常用数据进行缓存)
一、InitializingBean 的作用
InitializingBean
作为一个接口,只有一个需要重写的方法
@Compoments
public class LearnClass implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("成功调用afterPropertiesSet");
}
}
Spring项目在启动的时候,会初始化bean,当初始化完毕的时候,
会触发被 @componment
、@Service
等指令注解的类,其中的afterPropertiesSet
方法
上面代码的效果如下所示,成功输出了:“成功调用afterPropertiesSet”
二、InitializingBean 的应用场景(在项目初始化时对常用数据进行缓存)
(以下为转载)原本地址:InitializingBean在项目中的使用
使用场景
最近在项目中需要在项目初始化的时候,对一些常用数据进行缓存,我的第一反应是监听器,所以使用了java的ServletContextListener
全局异常监听器,但是出现了一个问题,就是项目使用的spring
,而ServletContextListener监听器
是监听的tomcat
的启动过程,而不是Spring容器
,所以使用ServletContextListener
导致Spring
中bean
还未初始化成功,便执行了监听器中的缓存,导致空指针异常,所以今天记录一下后面的解决办法!
举例
大体思路:使用spring中的InitializingBean接口,监听spring的启动过程,在spring装载完所有的bean的时候,会自动调用实现InitializingBean的afterPropertiesSet()方法,在里面去调用初始化用的服务或者逻辑就行。
秒杀场景应用举例:
@Controller
@RequestMapping("/miaosha")
public class MiaoshaController implements InitializingBean {
@Autowired
RedisService redisService;
@Autowired
GoodsService goodsService;
private HashMap<Long, Boolean> localOverMap = new HashMap<Long, Boolean>();
/**
* 系统初始化
* 将所有的商品库存加载到缓存中
* */
public void afterPropertiesSet() throws Exception {
List<GoodsVo> goodsList = goodsService.listGoodsVo();
if(goodsList == null) {
return;
}
for(GoodsVo goods : goodsList) {
redisService.set(GoodsKey.getMiaoshaGoodsStock, ""+goods.getId(), goods.getStockCount());
localOverMap.put(goods.getId(), false);
}
}
}
拓展
关于InitializingBean
和init-method
方法在初始化bean的的一些介绍,所以这里就一并记录下。
InitializingBean
的afterPropertiesSet
和init-method
相同点是都是初始化方法使用的,但是这里问题是他们谁先执行?
InitializingBean初始化代码如下:
init-method配置:
看执行打印结果:
可以看到,先执行InitializingBean
的afterPropertiesSet
方法,而后执行init-method
方法,可以从中得出几点总结
-
Spring为bean提供了两种初始化bean的方式,实现InitializingBean接口,实现afterPropertiesSet方法,或者在配置文件中通过init-method指定,两种方式可以同时使用。
-
实现InitializingBean接口是直接调用afterPropertiesSet方法,比通过反射调用init-method指定的方法效率要高一点,但是init-method方式消除了对spring的依赖。
-
如果调用afterPropertiesSet方法时出错,则不调用init-method指定的方法。