欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Boot学习笔记(七)Spring 中 InitializingBean 作用(如何在项目初始化时对常用数据进行缓存)

程序员文章站 2024-03-18 20:33:10
...

一、InitializingBean 的作用

InitializingBean作为一个接口,只有一个需要重写的方法

@Compoments
public class LearnClass implements InitializingBean {
	@Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("成功调用afterPropertiesSet");
    }
}

Spring项目在启动的时候,会初始化bean,当初始化完毕的时候,
会触发被 @componment@Service等指令注解的类,其中的afterPropertiesSet方法
上面代码的效果如下所示,成功输出了:“成功调用afterPropertiesSet”
Spring Boot学习笔记(七)Spring 中 InitializingBean 作用(如何在项目初始化时对常用数据进行缓存)


二、InitializingBean 的应用场景(在项目初始化时对常用数据进行缓存)

(以下为转载)原本地址:InitializingBean在项目中的使用

使用场景

最近在项目中需要在项目初始化的时候,对一些常用数据进行缓存,我的第一反应是监听器,所以使用了java的ServletContextListener全局异常监听器,但是出现了一个问题,就是项目使用的spring,而ServletContextListener监听器是监听的tomcat的启动过程,而不是Spring容器,所以使用ServletContextListener导致Springbean还未初始化成功,便执行了监听器中的缓存,导致空指针异常,所以今天记录一下后面的解决办法!

举例

大体思路:使用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);
		}
	}
	
}

拓展

关于InitializingBeaninit-method方法在初始化bean的的一些介绍,所以这里就一并记录下。

InitializingBeanafterPropertiesSetinit-method相同点是都是初始化方法使用的,但是这里问题是他们谁先执行?

InitializingBean初始化代码如下:
Spring Boot学习笔记(七)Spring 中 InitializingBean 作用(如何在项目初始化时对常用数据进行缓存)

init-method配置:
Spring Boot学习笔记(七)Spring 中 InitializingBean 作用(如何在项目初始化时对常用数据进行缓存)

看执行打印结果:
Spring Boot学习笔记(七)Spring 中 InitializingBean 作用(如何在项目初始化时对常用数据进行缓存)
可以看到,先执行InitializingBeanafterPropertiesSet方法,而后执行init-method方法,可以从中得出几点总结

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

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

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

相关标签: # Spring Boot