@postconstruct执行两次问题

来源:互联网 发布:陕西干部网络培训网 编辑:程序博客网 时间:2024/04/30 22:17

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

<context-param>

<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-*.xml</param-value>
</context-param>
<listener>
<description>spring监听器</description>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

<servlet>
<servlet-name>restSpringMvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<description>spring mvc 配置文件</description>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
</servlet>


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

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
 <property name="corePoolSize" value="3" />
 <property name="keepAliveSeconds" value="200" /> 
 <property name="maxPoolSize" value="5" />
  <property name="queueCapacity" value="25" />
</bean>
<!-- 启动文件目录监督服务 -->
<bean id="tlogWatchService" class="com.ecoman.tlog.TlogWatchService">
 <property name="threadPoolTaskExecutor" ref="taskExecutor"/>
</bean>

在方法上加上@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<Path> e = (WatchEvent<Path>) 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容器启动时,会被加载两次,也就会创建两个实例,而这个方法也会被执行两次。

0 0
原创粉丝点击