一.spring容器都初始化完成之后做操作
packagecom.bijian.study.listener;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.context.ApplicationListener;importorg.springframework.context.event.ContextRefreshedEvent;importorg.springframework.web.context.support.XmlWebApplicationContext;importcom.bijian.monitor.FileMonitor;public class ContextFileListener implements ApplicationListener{
@AutowiredprivateFileMonitor fileMonitor;
@Overridepublic voidonApplicationEvent(ContextRefreshedEvent event) {if(event.getSource() instanceofXmlWebApplicationContext){if(((XmlWebApplicationContext)event.getSource()).getDisplayName().equals("Root WebApplicationContext")){try{
fileMonitor.monitor();
fileMonitor.start();
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
}
二.applicationContext.xml添加配置
三.添加文件監聽 FileMonitor、FileListener 可看資料commons-io-2.4
packagecom.bijian.study.monitor;importjava.io.File;importorg.apache.commons.io.monitor.FileAlterationListener;importorg.apache.commons.io.monitor.FileAlterationMonitor;importorg.apache.commons.io.monitor.FileAlterationObserver;public classFileMonitor {private FileAlterationMonitor monitor = null;privateString filePath;privateFileAlterationListener alterationListener;private long intervalTime = 10000L;public FileMonitor(long interval) throwsException {
monitor= newFileAlterationMonitor(interval);
}public FileMonitor() throwsException {
monitor= newFileAlterationMonitor(intervalTime);
}public voidmonitor(String path, FileAlterationListener listener) {
FileAlterationObserver observer= new FileAlterationObserver(newFile(path));
monitor.addObserver(observer);
observer.addListener(listener);
}public voidmonitor() {
FileAlterationObserver observer= new FileAlterationObserver(newFile(filePath));
monitor.addObserver(observer);
observer.addListener(alterationListener);
}public void stop() throwsException {
monitor.stop();
}public void start() throwsException {
monitor.start();
}publicString getFilePath() {returnfilePath;
}public voidsetFilePath(String filePath) {this.filePath =filePath;
}publicFileAlterationListener getAlterationListener() {returnalterationListener;
}public voidsetAlterationListener(FileAlterationListener alterationListener) {this.alterationListener =alterationListener;
}public longgetIntervalTime() {returnintervalTime;
}public void setIntervalTime(longintervalTime) {this.intervalTime =intervalTime;
}
}
packagecom.bijian.study.listener;importjava.io.File;importorg.apache.commons.io.monitor.FileAlterationListener;importorg.apache.commons.io.monitor.FileAlterationObserver;public class FileListener implementsFileAlterationListener {
@Overridepublic voidonStart(FileAlterationObserver observer) {//TODO Auto-generated method stub
System.out.println("onStart()");
}
@Overridepublic voidonDirectoryCreate(File directory) {//TODO Auto-generated method stub
System.out.println("onDirectoryCreate()");
}
@Overridepublic voidonDirectoryChange(File directory) {//TODO Auto-generated method stub
System.out.println("onDirectoryChange()");
}
@Overridepublic voidonDirectoryDelete(File directory) {//TODO Auto-generated method stub
System.out.println("onDirectoryDelete()");
}
@Overridepublic voidonFileCreate(File file) {//TODO Auto-generated method stub
System.out.println("onFileCreate()");
}
@Overridepublic voidonFileChange(File file) {//TODO Auto-generated method stub
System.out.println("onFileChange()");
}
@Overridepublic voidonFileDelete(File file) {//TODO Auto-generated method stub
System.out.println("onFileDelete()");
}
@Overridepublic voidonStop(FileAlterationObserver observer) {//TODO Auto-generated method stub
System.out.println("onStop()");
}
}
至此完成啟動項目,在指定文件夾D:/SVN/下增加、修改、刪除文件都會觸發相關方法。
附:解決onApplicationEvent方法被執行兩次以上的問題
原因:
在web 項目中(spring mvc),系統會存在兩個容器,一個是root application context ,另一個就是我們自己的 projectName-servlet context(作為root application context的子容器)。在一個類里面實現了ApplicationListener接口,用于在初始化完成后做一些事情,但是Debug或輸出日志,發現它執行了3次,其中一次是Spring 框架初始化時執行,另外兩次是在項目啟動成功后,加載Spring-MVC時執行的。
解決方法:
1.根據對象值來告訴定時器只執行一次
通過打 breakpoint看到,這兩次執行中,onApplicationEvent(ContextRefreshdEvent event)方法中的 event對象值不同,第一次是 Root WebApplicationContext , 據此可以根據對象值來告訴定時器只執行一次即可,如如上實例所示,在這我System.out.println輸出((XmlWebApplicationContext)event.getSource()).getDisplayName()。
packagecom.bijian.study.listener;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.context.ApplicationListener;importorg.springframework.context.event.ContextRefreshedEvent;importorg.springframework.web.context.support.XmlWebApplicationContext;importcom.bijian.study.monitor.FileMonitor;public class ContextFileListener implements ApplicationListener{
@AutowiredprivateFileMonitor fileMonitor;private static boolean isStart = false;
@Overridepublic voidonApplicationEvent(ContextRefreshedEvent event) {if(event.getSource() instanceofXmlWebApplicationContext){
System.out.println(((XmlWebApplicationContext)event.getSource()).getDisplayName());if(((XmlWebApplicationContext)event.getSource()).getDisplayName().equals("Root WebApplicationContext")){try{
fileMonitor.monitor();
fileMonitor.start();
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
}
System.out.println(((XmlWebApplicationContext)event.getSource()).getDisplayName());輸出的內容如下所示:
Root WebApplicationContext
WebApplicationContextfor namespace 'springMVC-servlet'WebApplicationContextfor namespace 'springMVC-servlet'
2.使用一個類變量isStart,控制只執行一次
packagecom.bijian.study.listener;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.context.ApplicationListener;
importorg.springframework.context.event.ContextRefreshedEvent;
importorg.springframework.web.context.support.XmlWebApplicationContext;
importcom.bijian.study.monitor.FileMonitor;
public class ContextFileListener implements ApplicationListener{
@Autowired
privateFileMonitor fileMonitor;
private static boolean isStart = false;
@Override
public voidonApplicationEvent(ContextRefreshedEvent event) {
if (!isStart) {
isStart = true;
try{
fileMonitor.monitor();
fileMonitor.start();
} catch(Exception e) {
e.printStackTrace();
}
}
}
}