spring 컨 텍스트 중복 로드 된 문제 기록

프로젝트 환경: springmvc, spring, hibenate
 
이 렇 습 니 다. 프로젝트 가 시 작 될 때 스 캔 작업 을 시작 하고 스 캔 작업 을 수행 해 야 합 니 다. 일반적인 작업 이 아니 기 때문에 quartz 를 고려 하지 않 고 이 기능 을 완성 하려 면 여러 가지 실현 방법 이 있 습 니 다. 예 를 들 어:
 
1. 사용자 정의 모니터
public class StartupListener implements ServletContextListener {
  public void contextInitialized(ServletContextEvent event) {
    ServletContext context = event.getServletContext();
    ApplicationContext cxt = WebApplicationContextUtils.getRequiredWebApplicationContext(context);
    Scanner scanner = (Scanner) ctx.getBean("scanner ");
    scanner.start();
  }
}
<listener>
 <listener-class>com.blablah.StartupListener</listener-class>
</listener>

 
2. spring InitialingBean 인터페이스 구현
@Component
public class ScanTask implements InitializingBean {
   @Autowired private Scanner scanner;
   public void afterPropertiesSet() throws Exception {
      scanner.start();
   }
}

 
프로젝트 가 시 작 된 후에 스 캔 스 레 드 가 두 번 시 작 된 것 을 발 견 했 습 니 다. 즉, 두 개의 Scanner 인 스 턴 스 가 실행 되 고 있 습 니 다. 이 로 인해 데이터 가 혼 란 스 러 웠 습 니 다. 이때 웹 xml 설정 은 다음 과 같 습 니 다.
<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:applicationContext.xml </param-value>
</context-param>
 
<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
 
<servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>classpath:springmvc-servlet.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
 
<servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

 
이 문 제 를 일 으 킨 이 유 는 spring 의 ContextLoader Listener 와 springmvc 의 Dispatcher Servlet 가 시작 할 때 spring 컨 텍스트 를 반복 적 으로 불 러 왔 기 때 문 입 니 다. 인터넷 에 도 많은 제안 방안 이 있 습 니 다. 예 를 들 어:
Spring MVC – Beans loaded twice:http://www.mkyong.com/spring-mvc/spring-mvc-beans-loaded-twice
Spring - application Initialized twice? :
http://stackoverflow.com/questions/20704086/spring-application-initialized-twice
 
그러나 이들 의 건 의 를 시도 한 후에 도 문 제 는 해결 되 지 않 았 다.컨 텍스트 를 불 러 오 는 것 이 목적 이 라면 하 나 를 시작 하면 되 지 않 습 니까? 웹. xml 을 수정 하고 Dispatcher Servlet 을 사용 하여 spring 과 springmvc 컨 텍스트 정 보 를 불 러 오 면 문제 가 해결 되 었 습 니 다.
 
<servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>classpath:applicationContext.xml,classpath:springmvc-servlet.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
 
<servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

좋은 웹페이지 즐겨찾기