spring容器监听器

怼烎@ 2022-11-29 00:50 249阅读 0赞

spring容器监听器(初始化redis数据)

redis缓存
  1. 一个完整redis缓存操作包括3个步骤
  2. 1.缓存数据库初始化(预热)[将数据库数据加载缓存]
  3. 2.缓存的业务操作
  4. 3.缓存数据持久化[将缓存数据同步到数据库]
  5. 思考:
  6. 1.需要将哪些数据进行初始化处理
  7. 1>需要频繁变动[DML]的数据,需要初始化缓存
  8. 2>不需要频繁变动[DQL]的数据,需要初始化的缓存
  9. 此处初始化:1.攻略的统计对象(vo)
  10. 2.初始化处理逻辑应该放置在哪个项目实现
  11. 1>trip-mgrsite trip-website-api
  12. 2>api项目后续可能需要进行拓展,比如分布式微服务或者集群操作,如果将初始化逻辑放置api项目
  13. 会存在多次初始化操作,不建议,另外一个点,redis缓存数据初始化属于数据管理范畴,建议放置在trip-mgrsite项目中
  14. 3.初始化处理逻辑应该放置哪个组件中实现(fillter servlet interceptor controller listener)
  15. 分析需求实现特点:
  16. 1>初始化次数尽可能少
  17. 2>尽可能保证业务操作之前数据就准备好了
  18. web组件listener,可以监听请求对象(request) 会话对象(session) 容器对象的创建与销毁动作
  19. 初始化逻辑强调尽可能在项目(web容器)启动之后,用户访问前执行,此时发现listener这个组件跟处理逻辑特点相符合
  20. --------------------------------------------------------------------------
  21. web组件监听器:web组件,监听的tomcatweb容器
  22. spring容器监听器:springmvc中组件,监听的spring容器,推荐使用:背靠spring容器,功能更加丰富
spring容器监听器
  1. Spring框架中有哪些不同类型的事件?
  2. Spring 提供了以下5种标准的事件:
  3. 1)上下文更新事件(ContextRefreshedEvent):在调用ConfigurableApplicationContext 接口中的
  4. refresh()方法时被触发,当spring容器启动并初始化之后马上执行该方法
  5. 2)上下文开始事件(ContextStartedEvent):当容器调用ConfigurableApplicationContext
  6. Start()方法开始/重新开始容器时触发该事件
  7. 3)上下文停止事件(ContextStoppedEvent):当容器调用ConfigurableApplicationContext
  8. Stop()方法停止容器时触发该事件
  9. 4)上下文关闭事件(ContextClosedEvent):当ApplicationContext被关闭时触发该事件。
  10. 容器被关闭时,其管理的所有单例Bean都被销毁
  11. 5)请求处理事件(RequestHandledEvent):在Web应用中,当一个http请求(request)结束触发该事件
  12. 如果一个bean实现了ApplicationListener接口,当一个ApplicationEvent 被发布以后,bean会自动被通知
spring容器监听器(实现ApplicationListener接口)
  1. @Component
  2. public class RedisDataInitListener implements ApplicationListener<ContextRefreshedEvent> {
  3. @Autowired
  4. private IStrategyService strategyService;
  5. @Autowired
  6. private IStrategyRedisService strategyRedisService;
  7. @Override
  8. public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
  9. //1.查询mongodb所有攻略
  10. List<Strategy> list = strategyService.list();
  11. StrategyStatisVO statisVO = new StrategyStatisVO();
  12. //2.遍历所有攻略,封装成vo对象(开发时需要慎重遍历所有数据同步,因为可能造成内存溢出)
  13. for (Strategy strategy : list) {
  14. if (strategyRedisService.isStrategyVoExist(strategy.getId())) {
  15. continue;
  16. }
  17. //BeanUtils工具类,拷贝属性
  18. BeanUtils.copyProperties(strategy, statisVO);
  19. statisVO.setStrategyId(strategy.getId());
  20. //3.将vo缓存到redis中
  21. strategyRedisService.setStrategyStatisVO(statisVO);
  22. }
  23. }
  24. }
  25. //上面方法中需要加上if判断语句,判断key是否存在
  26. 存在问题:如果第一次初始化后,前端进行vo对象统计,redis中统计数据跟数据库中数据不一致了,
  27. 如果第二次再进行初始化,后面操作会覆盖之前redis缓存的vo对象
  28. 解决方案:如果已经存在key,就直接跳过,不需要初始化
小结
  1. 1.当要初始化redis时,我们可以使用spring容器监听器,就是在容器启动并初始化之后马上初始化数据
  2. 2.初始化数据时,我们需要注意,按需求封装,尽量避免遍历整张表,并且还需判断key是否存在,这步很关键
  3. 3.实现ApplicationListener即可操作即可,注意贴@Component注解,交给容器管理

发表评论

表情:
评论列表 (有 0 条评论,249人围观)

还没有评论,来说两句吧...

相关阅读

    相关 spring容器监听器

    spring容器监听器(初始化redis数据) redis缓存 一个完整redis缓存操作包括3个步骤 1.缓存数据库初始化(预热)[将数据库数据加

    相关 spring boot -- 监听器

    一些系统配置,存储在数据库中,需要在项目启动时加载进缓存。此时可以实现ApplicationListener类来实现监听。 第一步: package com.lic