2012-06-08 3 views
5

나는 점차적으로 스프링을 사용 해왔다. 개념에 대한 합리적인 생각이 있다고 생각하지만 다른 스레드에서 정보를 뒤집어서 정보를 뒤집어 놓았다. 저 ... 스프링 프로토 타입 빈과 스프링의 이점

"

... 초기화 라이프 사이클 콜백 메서드가 구성 파괴 라이프 사이클 콜백이 호출되지, 프로토 타입의 경우에 관계없이 범위의 모든 개체에 대한라고하지만. 클라이언트 코드가 정리해야합니다가 프로토 타입 범위가 지정된 객체를 생성하고 프로토 타입 bean이 보유하고있는 값 비싼 리소스를 해제합니다 .Steotype 범위의 Bean이 보유한 리소스를 Spring 컨테이너에서 해제하려면 사용자 정의 bean 후 처리기를 사용하십시오. 깨끗하게 될 eed. "

예를 들어 요청 당 "새"빈 인스턴스가 필요한 프로토 타입 빈을 사용하려는 실제 사용 사례가 있다고 생각합니다. 그러나이 스 니펫 (Spring 3 문서)에서 이해할 수 있듯이 Spring은 정리가 필요한 bean에 대한 참조를 유지합니다. 참조 자체는 가비지 수집기에서 bean을 자동으로 지우지 않음을 의미합니다. 게다가 나는 프로토 타입 빈에 의해 유지되는 자원을 수동으로 정리해야한다는 것을 알았다.

이것이 올바른지 누군가가 알려 주실 수 있습니까? 그렇다면이 문제를 해결하는 데 사용되는 일반적인 패턴이 있습니까? Spring이 이런 방식으로 프로토 타입 빈을 구현하는 이유를 설명 할 수있는 답변을 보내 주시면 감사하겠습니다.

+1

당신은 당신이 사용자 요청의 범위를 수 요청에 의해 범위가 필요 /html/ch04s04.html –

+0

@Spaeth 오해의 소지가 있었을 수 있습니다 ... 이것은 웹 응용 프로그램이 아니며, 나는 "무언가"를 처리하기 위해 만들어 질 새로운 인스턴스에 대한 필요성을 보여 주려고했습니다. – JLove

답변

13

봄은 정리해야 할 bean에 대한 참조 (참조 자체는 빈이 가비지 수집기에 의해 자동으로 지워지지 않음을의 L합니다).

예, 컨테이너에는 프로토 타입 범위 Bean에 대한 참조가 없습니다. 이것이 파괴 콜백이 호출되지 않는 이유입니다. 스프링은 빈 인스턴스를 생성하고 와이어 처리하고 콜백 콜을 호출합니다. 인스턴스를 제공하고 해당 빈을 잊어 버립니다.

요청 당 프로토 타입 범위 Bean을 안전하게 만들 수 있습니다. Spring은 인스턴스를 제공 할 것이고 그 bean에 대한 참조가 없다면 Spring은 가비지 수집 될 것입니다. 그러나 Spring은 빈을 생성 한 후에 빈에 대해 아무것도 모르기 때문에 파괴 콜백을 호출 할 수 없습니다. 사실이 사실은 왜 Java가 소멸자를 가지지 않는지에 대한 의문을 제기합니다.

그래서 프로토 타입 범위 콩을 정리합니까? 자, Java의 다른 리소스를 명시 적으로 정리하는 것처럼 - 명시 적으로. close(), destroy(), stop() 또는 원하는 이름으로 입력하십시오 (Closeable 구현을 고려하십시오.) 가비지 수집기는 전체 개체 그래프를 해제하고 데이터베이스 연결과 같은 영구 리소스는 DataSource이 닫히면 닫힙니다.

+1

감사합니다. 대답 ... 이것은 내가이 발췌 문장을 읽기 전에 작동 할 것이라고 믿었던 방식이었습니다. 아마도 그것을 잘못 해석했을 것입니다! 기본적으로 ... 계속 진행하면서 파괴의 흔적을 남기고 모든 것이 나 뒤에 정리 될 것입니다 :-) – JLove

7

당신은 문서를 오해은 명시 적으로 말한다.

는 Spring 컨테이너는, 프로토 타입 범위의 콩 보유 자원을 해제에 대한 참조를 보유하고 사용자 정의 빈 포스트 프로세서를 사용하여 시도 얻으려면 콩이 필요해. 배웠어.

그래서 스프링은 생성 한 프로토 타입 빈에 대한 참조를 보유하지 않습니다. 필요하다면이 bean에 대한 참조를 보유하는 bean post-processor를 만드는 것은 당신에게 달려 있습니다.

또한, 프로토 타입 bean이 정리해야하는 자원을 보유하는 것은 거의 없습니다. 예를 들어, 연결 풀 (시스템 종료시 제대로 파괴되어야 함)은 일반적으로 싱글 톤 빈입니다. 프로토 타입을 만드는 것은별로 의미가 없습니다. 프로토 타입 bean은 종종 작은 시간 동안 사용되기 때문에 클라이언트를 작성하는 클라이언트는 더 이상 사용하지 않을 때 명시 적으로 자원을 해제 할 수 있습니다. 새 스트림이나 연결을 만들고 finally 블록에서 닫는 것과 같습니다.

3

스프링은 프로토 타입 범위를 사용하여 생성 된 모든 인스턴스에 대한 지식이 없습니다. 프로토 타입 범위 Bean을 인스턴스화하고 구성하고 문서에 주석 처리 된대로 클라이언트에 전달합니다.

봄은 프로토 타입 콩의 전체 라이프 사이클을 관리하지 않습니다 다음 컨테이너, 인스턴스 구성, 장식 그렇지 않으면 에게 프로토 타입 객체를 조립, 클라이언트에 손과 그 프로토 타입 인스턴스의 더 지식이 없습니다 .) http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference, 경우에

http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch04s04.html#beans-factory-scopes-prototype