在某些情况下,有可能你会有这种需求:在Spring/SpringMVC项目中,当Spring/SpringMVC启动完成后,你需要执行一个方法来完成某些事件(比如创建网站地图,比如从订阅Redis服务器等),这个时候,可以使用Tomcat/Servlet容器提供的事件回调机制来完成,但是这样有个问题是:无法使用Spring提供的Annotation,解决方法是:

/** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* and open the template in the editor.*/
package com.storezhang.web;import com.storezhang.util.TimeUtils;
import com.storezhang.video.util.SiteMapUtils;
import java.util.Timer;
import java.util.TimerTask;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Service;/*** 启动监听器** @author Storezhang*/
@Service
public class StartupListener implements ApplicationListener<ContextRefreshedEvent> {@Autowiredprivate SiteMapUtils sites;@Overridepublic void onApplicationEvent(ContextRefreshedEvent evt) {if (evt.getApplicationContext().getParent() == null) {createSitemap();}}private void createSitemap() {Timer timer = new Timer("createSitemap", true);timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("--->Create sitemap...");sites.createSiteMap();System.out.println("--->Success create sitemap...");}}, 1 * TimeUtils.MIN);}
}

后续研究: 
applicationontext和使用MVC之后的webApplicationontext会两次调用上面的方法,如何区分这个两种容器呢?

但是这个时候,会存在一个问题,在web 项目中(spring mvc),系统会存在两个容器,一个是root application context ,另一个就是我们自己的 projectName-servlet context(作为root application context的子容器)。

这种情况下,就会造成onApplicationEvent方法被执行两次。为了避免上面提到的问题,我们可以只在root application context初始化完成后调用逻辑代码,其他的容器的初始化完成,则不做任何处理,修改后代码

如下:

@Override  
      public void onApplicationEvent(ContextRefreshedEvent event) {  
        if(event.getApplicationContext().getParent() == null){//root application context 没有parent,他就是老大.  
             //需要执行的逻辑代码,当spring容器初始化完成后就会执行该方法。  
        }  
      }

转载于:https://www.cnblogs.com/itjcw/p/5977911.html

Spring/SpringMVC在启动完成后执行方法相关推荐

  1. Spring中Bean创建完成后执行指定代码的几种实现方式

    Spring中Bean创建完成后执行指定代码的几种实现方式 1. 实现ApplicationListener接口 2. 实现InitializingBean接口 3. 使用@PostConstruct ...

  2. 解决Spring的java项目打包后执行出现“无法读取方案文档...“、“原因为 1) 无法找到文档; 2) 无法读取文档; 3) 文档的根元素不是...”问题

    解决Spring的java项目打包后执行出现"无法读取方案文档..."."原因为 1) 无法找到文档; 2) 无法读取文档; 3) 文档的根元素不是..."问题 ...

  3. spring在项目启动时就执行特定方法

    如何在项目启动时就执行特定方法 1. 方法上加注解@PostConstruct @Compant public class InitDemo{@PostConstructpublic void ini ...

  4. springboot项目启动成功后执行一段代码的两种方式

    实现ApplicationRunner接口 package com.lnjecit.lifecycle;import org.springframework.boot.ApplicationArgum ...

  5. spring项目一启动就自动运行方法(资源加载初始化)

    参考一个写的不错的博客,原文请看: https://www.cnblogs.com/baixianlong/p/11117665.html 记录几种常用的方式 1.实现ApplicationRunne ...

  6. easyBCD删除win7启动项后修复方法

    说明: 在使用easyBCD删除win7启动项后,可执行下面命令修复启动项 使用管理员方式运行cmd.exe输入:bcdboot: c\windows /l zh-CN

  7. acriviti流程经过节点后执行方法,serviceTask

    创建一个要执行的类:  在spring中配置这个类的bean:  在流程定义文件中加一个节点,当执行到这个节点时,启动类的方法,控制台输出 sayHello :

  8. 【Activiti】acttiviti+spring+SpringMvc+mybatis启动时候报错解决

    启动流程实例时 startProcessInstanceByKey 报错 报错信息 ``` org.apache.ibatis.reflection.ReflectionException: Ther ...

  9. 启动celery后执行任务报错:django.core.exceptions.ImproperlyConfigured

    工作的环境版本如下: [Django version]: 2.1 [celery version]:4.4.0rc2 [python version]: 3.7 [Redis version]:3.2 ...

最新文章

  1. C#保存文件为无BOM的utf8格式
  2. location.hash属性介绍
  3. HTTPS通信的C++实现
  4. 华尔街英语软件_华尔街英语吧啦吧啦聊点啥:美式“人情世故”
  5. mysql dba系统学习(18)mysql主从复制的实现 mysql dba系统学习(19)配置mysql+lvs+keeplived实现Mysql读操作的负载均衡
  6. 记录爬取信用中国,里面的行政许可内容,行政处罚,守信激励的内容,并以excel形式显示
  7. 微服务网关Ocelot
  8. android+百度lbs云,百度——LBS.云 v2.0——云存储扩展字段——Android
  9. Symbian和C++ SDK开发入门之运行
  10. 一秒实现免费下载百度文库资料的方法
  11. python之随机生成一个手机号码
  12. 将Android Studio的设置恢复到初始化(清除所有的设置)
  13. 直流屏电源模块GF22007-2高频充电模块R22007
  14. 盘点市场营销工作中的5个办公神器
  15. FC炸弹人 java源码下载
  16. 使用flask从零构建自动化运维平台系列三
  17. 柬埔寨招聘中文计算机,柬埔寨ll中文老师1000美金+招聘机会来啦,快来围观!!!...
  18. Cocos2d-x 3.1.1 学习日志16--A星算法(A*搜索算法)学问
  19. 一套好用的MES系统,到底要具备哪些特质?
  20. 2022华为软挑比赛(初赛笔记)

热门文章

  1. Swift - UIBezierPath
  2. 27、ArrayList和LinkedList的区别
  3. ffmpeg结构体SpecifierOpt说明文档
  4. bat中的“多线程”处理代码
  5. JAVA中运用数组的四种排序方法
  6. 浅谈C++中内存泄漏的检测
  7. rust异步编程--理解并发/多线程/回调/异步/future/promise/async/await/tokio
  8. (82)介绍AXI4-Stream总线
  9. (44)生成时钟场景
  10. (50)FPGA面试技能提升篇(版本控制工具Clearcase、Git)