Spring容器被被多次初始化问题排查解决方案

问题描述
    项目中使用quartz创建了一个定时任务,在系统启动后立即执行,我发现项目在启动过程中,会执行4次这个定时任务,也就是说项目被初始化了4次,这样会导致与任务相关的点出问题
    最初我是现从精简Spring与SpringMVC的配置开始入手解决这个问题的,精简完成后由初始化4次降为了两次,后来又通过配置tomcat将初始化两次降为一次,至此解决了这个问题,下面就来详细讲一下这两步!
第一步:精简配置项
  项目本身Spring与SpringMVC的配置文件是写在一起的, 在web.xml中配置为

	
	
		
		org.springframework.web.context.ContextLoaderListener
	
  	
		contextConfigLocation
		
			classpath*:/spring/applicationContext.xml
		
	

	
	
		SpringMVC
		org.springframework.web.servlet.DispatcherServlet
		
		
			contextConfigLocation
			classpath:/spring/applicationContext.xml
		
		1
		
	
	
		SpringMVC
		*.shtml
	
	
        SpringMVC
        /dwr/*
    

   这样会有一个问题,会导致applicationContext.xml中配置的bean和被扫描到的注解类,都会被ContextLoaderListener与DispatcherServlet重复加载,这里是第一个问题点。
   随后我将配置文件拆分为两个,applicationContext.xml与applicationContext-mvc.xml,我希望ContextLoaderListener与DispatcherServlet加载各自的上下文
第二步:配置tomcat
   在tomcat中配置的Host与其子元素Context元素中的两个属性
的冲突配置会导致了应用程序重复加载

      
      
           
      	
      

   在Tomcat加载时会将Host元素的appbase属性配置的路径下所有应用程序启动,然后再启动Context元素的docBase属性配置的路径下的应用程序。
   如果你Context元素的docBase属性配置的路径下的应用程序,同在Host元素的appbase属性配置的路径下,那么就会被启动两次,这是第二个问题点。
   我是因为两个路径配置重叠了所以导致了启动了两次,所以我将Context元素docBase置为了空

完结

你可能感兴趣的:(spring,tomcat,springMVC)