@postconstruct执行两次问题

在web.xml中经常看到这样的配置

contextConfigLocation
classpath:spring-*.xml


spring监听器
org.springframework.web.context.ContextLoaderListener


restSpringMvc
org.springframework.web.servlet.DispatcherServlet

spring mvc 配置文件
contextConfigLocation
classpath:spring-mvc.xml



然而,当你在spring-mvc.xml中做了这样的配置


 
  
 
 



 

在方法上加上@postcontruct注解

@PostConstruct
public void handleEvents() throws InterruptedException{
logger.info("开启文件监听服务..."+this);
threadPoolTaskExecutor.execute(new Runnable() {
@Override
public void run() {
try {
while(true){
WatchKey key = watchService.take();
for(WatchEvent event : key.pollEvents()){
Kind kind = event.kind();
if(kind == StandardWatchEventKinds.OVERFLOW){
continue;
}
@SuppressWarnings("unchecked")
WatchEvent e = (WatchEvent) event;
Path fileName = e.context();
String name = String.valueOf(fileName);
logger.info("监听到新增文件,文件名:" + name);
if(name.contains(".tlog")){
methodInvoke(name);
}
}
if(!key.reset()){
break;
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}

当spring容器启动时,就会创建两个监听。这是为什么呢?

我们知道spring容器创建bean时,默认是单例模式,那为什么会有两个对象呢?原来由于web.xml中的配置问题,spring-mvc.xml在spring容器启动时,会被加载两次,也就会创建两个实例,而这个方法也会被执行两次。

你可能感兴趣的:(spring)