2012-05-29 2 views
0
  1. 스프링 컨테이너 (XMLBeanFactory)가 Spring에 의해 정상적으로 언로드되는 경우는 언제입니까?
  2. 응용 프로그램이 실행 중이지만 BeanFactory에 대한 처리기 만 범위를 벗어나면 어떻게됩니까?
  3. 스프링 컨테이너를로드하는 가장 좋은 방법은 무엇입니까? handler = new BeanFactory() 올바른 접근 방식을 취하고 있습니까?


업데이트 :
컨테이너가 범위를 벗어나 때, 우리는 참으로 close() 메소드가있는 것 차례 릴리스의 모든 보유 자원을 호출 할 것으로 예상한다. 그러나 그것은 일어나지 않습니다! 스프링 컨테이너가 범위를 벗어나지 만 여전히 메모리가 가득 찬 경우가 발생했습니다 (OutOfMemory 오류). 그 이유는 Spring 컨테이너로 생성 된 SessionFactory 객체가 정적으로 생성 될 때 결코 가비지 수집되지 않기 때문입니다. 이는 컨테이너가 범위를 벗어 났을 때 close()->destroy()이 호출되지 않았 음을 의미합니다. Spring 자체에 누수 문제가 있다고 생각하게 만듭니다.Spring BeanFactory로드 및 언로드

답변

3
  1. 읽기,

    4.2.2 Instantiating a container

    당신이 웹 응용 프로그램에 스프링을 사용하려는 경우 읽기 당신은 그것을 인스턴스화하고 있습니다. 나는 웹 애플 리케이션, 이것은 일반적으로 문맥 종료에서 이루어집니다. 명령 줄에서 특히 "AbstractApplicationContext"범위를 벗어날 무엇으로

  2. 같은에서 "가까운"방법을 통해 (문맥을 닫해야합니다. "닫기"방법은 종료 자 단계의 일부인지 확실하지 여부. 나는 파이널 라이저가 파괴 상을 발생하게 희망한다.
  3. 을 다른 사람이 말했듯이, 직접 BeanFactory를 사용하지 않습니다. ApplicationContext를 만들기. 웹 애플 리케이션을위한 가장 일반적인 방법은 ContextLoaderListener에, 그리고 명령 줄 프로그램을위한 것 ClassPathXmlApplicationContext합니다.

// 특정 유형을 유지, 그래서 우리는때문에 나중에 "닫기"메서드를 호출 할 수 있습니다IT는 ApplicationContext를 인터페이스 자체의 //없는 부분입니다. ClasspathXmlApplicationContext 컨텍스트 = 새로운 ClasspathXmlApplicationContext (새로운 String [] { "applicationContext.xml}); 다음

당신은 그것을 종료 이후에 : 웹 어플리케이션에 대한

context.close(); 

:

<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> 
+0

감사합니다. Matt. (1)과 (3)은 상당히 도움이되었습니다. (2)를 위해, 나는 진짜 관심사가있다. 업데이트를 참조하십시오. – Leo

+0

close()가 finalizer의 일부가 아닌 경우 웹 응용 프로그램 컨텍스트가 종료되거나 JVM이 종료 될 때 누가이 메서드를 트리거합니까? – Leo

0

BeanFactory는 Spring에서 일을 처리하는 고대 방법입니다. Spring 컨텍스트를 인스턴스화하는보다 현대적인 방법은 ApplicationContext 인터페이스를 사용하는 것이다. 참고로,이 방법에 따라 달라집니다

4.14.4 Convenient ApplicationContext instantiation for web applications

+0

을 BeanFactory로는 ApplicationContext를보다 고대 아니다. 그들은 거의 같은 시간에 만들어졌다.ApplicationContext는 일반적인 BeanFactory의 풍부한 버전이며 메시징, 이벤트, 계층 구조, 라이프 사이클 등을 포함합니다. –