在某些情况下,有可能你会有这种需求:在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> { @Autowired private SiteMapUtils sites; @Override public void onApplicationEvent(ContextRefreshedEvent evt) { if (evt.getApplicationContext().getParent() == null) { createSitemap(); } } private void createSitemap() { Timer timer = new Timer("createSitemap", true); timer.schedule(new TimerTask() { @Override public 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容器初始化完成后就会执行该方法。
}
}
相关推荐
主要介绍了SpringMVC在启动完成后执行方法源码解析,还是非常不错的,在这里分享给大家,需要的朋友可以参考下。
SpringMVC+Spring+Mybatis+数据库完整代码可运行,适合学习参考,增删查改操作都有
这是一个简单的SpringMVC用aop写操作日志的例子
Spring Quartz 动态暂停、恢复、修改定时任务的一个demo,使用maven构建,框架采用spring springmvc jpa,数据库mysql,含数据库脚本,运行可用,页面访问地址http://localhost:8080/quartz_demo/quartz/list
Spring4.3.15 + Quartz2.2 + Spring MVC管理可以管理任务的暂停,启动、立即执行一次、根据表达式重新调度等功能
这个框架是在学习Spring的时候,为了积累学习成果,自己搭建的,一般的系统开发也可以直接使用,包括一个系统开发的基础功能。 以下是当时自己开发时的日志,大致可以说明...直接执行Jetty类的main方法就可以启动服务
执行npm install下载对应的依赖完成后输入npm run dev启动项目。后端介绍后端配置的tomcat端口号是8181,这也就意味着你要修改如果你配置其他端口,就需要对前后端整体替换掉这个端口号包括sql文件里的,建议你还是...
在eclipse中导出为可执行的jar,无需部署到任何web容器中。直接通过bat或shell启动即可。 系统启动时自动从数据库中读取框架配置信息,job信息,调度信息注入到框架中。 本系统内嵌了jetty作为框架的web接口为本框架...
spring mvc + gulp demo 安装全局的npm 安装全局的gulp $ npm install gulp -g cd 到工程目录 src/glup 执行命令:npm install bower install 完事之后 到 src/gulp 目录下执行 gulp serve 就可以看到页面了 如果...
#简易脚手架 - mytemplate ##介绍 mytemplate是一个简易脚手架,mytemplate简易脚手架项目仍然处于项目开发阶段,还有很多功能没有完成。...配置数据库,在项目的src/main/webapp/下面有一个mytemplat
1. Spring中Bean的生命周期 2. SpringBoot项目启动时执行特定的方法: 3. SpringMVC处理请求的流程 1. Authentica
启动后,您应该可以访问并查看“ Hello World”。 可以使用PORT环境变量来控制应用程序端口。 使用./gradlew clean test或mvn clean verify运行测试。 使用./gradlew clean onejar或mvn clean compile assembly:...
项目启动:进入项目根目录,执行以下命令启动项目: bash复制代码mvn spring-boot:run 系统介绍:一汽租车辆共享平台采用了先进的互联网技术和创新的商业模式,为广大用户提供了便捷、高效的租车服务。通过整合一汽...
将压缩文件解压后,将脚本在数据库执行后,启动eclipse,切换工作空间为解压的目录,就可以使用了
使用IDEA/Eclipse导入项目,若为maven项目请选择maven,导入成功后请执行maven clean;maven install命令 修改src\main\resources里面的jdbc.properties 里面的数据库配置 将项目加入到tomcat容器里面,启动项目
【资源说明】 1、基于Spring Boot的社区论坛项目源码+数据库+项目说明.zip ...- 下载zip直接解压或安装git后执行克隆命令 `git clone https://github.com/AatroxC/WeCommunity.git` - 安装各组件并启动:Redis、ZooKee
完成后输入**npm run dev**启动项目 前台地址:localhost:8081,后台地址localhost:8081/#/admin ## 注意事项 如果你的项目前端启动端口是8080,那么后端的过滤器里面配置前端的端口是8081,你要改成8080,或者你...
本资源是一个基于SSM(Spring、SpringMVC、MyBatis)的网上点餐系统。它包含了完整的源代码、部署说明、演示视频以及源码介绍,旨在帮助开发者快速搭建一个功能完善、性能优越的在线点餐平台。源码介绍:本项目采用了...
1.创建一个utf-8的数据库,数据库名根据自己...8.生成好并刷新工程后注意修改spring-common.xml与spring-servlet.xml和web.xml 修改其中的数据库信息以及扫描包等信息 9.启动项目 访问:http://localhost:8080/项目名
SpringBoot特性以及它与Spring、SpringMVC的区别 Jvm类加载机制 Java中的锁机制 Java按行读取txt中的内容 ... - 当虚拟机启动时,用户需要指定一个需要执行的主类(包含main方法的那个类)虚拟机会先初始化这个类