SpringSpringMVC在启动完成后执⾏⽅法
在某些情况下,有可能你会有这种需求:在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 t.ApplicationListener;
import t.event.ContextRefreshedEvent;
import org.springframework.stereotype.Service;
/**
* 启动
*
* @author Storezhangspring framework是什么系统
*/
@Service
public class StartupListener implements ApplicationListener<ContextRefreshedEvent> {
@Autowired
private SiteMapUtils sites;
@Override
public void onApplicationEvent(ContextRefreshedEvent evt) {
if (ApplicationContext().getParent() == null) {
createSitemap();
}
}
private void createSitemap() {
Timer timer = new Timer("createSitemap", true);
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("--->");
System.out.println("--->Success ");
}
}, 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) {
ApplicationContext().getParent() == null){//root application context 没有parent,他就是⽼⼤.
//需要执⾏的逻辑代码,当spring容器初始化完成后就会执⾏该⽅法。
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论