2009-11-04 5 views
8

Guice로 만든 개체를 종료하거나 닫는 데 권장되는 패턴이 있습니까?Google Guice의 평생 ​​관리

내가 목표로하고있어 라이프 사이클은 다음과 같습니다

  1. 객체 (injector.getInstance(Foo.class))
  2. 를 얻기 위해 코드를 통해 인젝터
  3. 사용 인젝터를 만들기 Guice 모듈
  4. 을 준비 ...
  5. 상기 개체 (파일 핸들, TCP 연결 등)가 보유한 모든 리소스를 닫습니다. 나는 이것이 결정 론적 단계 (GC가 실행되는 언젠가는 아닙니다)가되기를 원합니다.
+0

일부 지원을하는 I 때문에 당신이 의미하는 것을 정말로 얻지 마십시오. – dlinsin

+0

몇 가지 추가 정보가 추가되었습니다. – ripper234

+7

"코드를 통해 인젝터를 사용하여 객체 (injector.getInstance (Foo.class))를 얻으십시오"- 이것은 Guice 또는 DI가 사용되는 방법과는 분명히 다르다. 그것은 단지 서비스 검색 자일뿐입니다. 그것은 당신의 객체 그래프를 만들어야하고 인젝터는 어떤 루트 부트 스트 래퍼 클래스에서만 생성되고 참조되어야합니다. – ColinD

답변

2

결정적인 단계 ("GC 실행 중일"이 아님)가되고 싶습니다.

죄송하지만 자바는 잘못된 언어입니다. DI 프레임 워크는 객체에 대한 모든 참조가 사라지는 시점을 알 수 없습니다. GC만이 이것을 알고 있습니다.

"닫을 수있는"리소스가있는 경우 try/finally 패턴을 사용하여 닫습니다 (아래 참조).

Closable c = // ... 
try { 
    c.use(); 
} finally { 
    c.close(); 
} 

이제는 조금 팔로우. Guice는 범위가 언제 시작하고 끝나는 지 알 수 있습니다. 사용자 지정 범위가 끝나면 정리 단계를 실행할 수 있습니다. 이 범위는 심지어 프록시를 반환 할 수 있으므로 허용 된 범위 밖에서 객체에 액세스하려고 시도하면 객체가 유효하지 않게됩니다. . ColinD에

(아, 그리고 한 - 공급자를 주입 :

편집 : Guiceyfruit 솔기가, Lifecycles

당신은 당신의 질문에 몇 가지 예제 코드를 추가 할 수 있습니다
+2

이것은 GC가 무엇인지에 대한 고전적인 오해라고 생각합니다 (특히 C++로 프로그래밍 한 경우이 실수를하기 쉽습니다). 가비지 수집 언어에서 개체 수명/GC는 파일 핸들이나 네트워크 소켓과 같은 리소스를 해제하는 것과 아무 관련이 없습니다. –

+0

코드 블록은 개체를 할당하지 않으므로 개체를 해제 할 책임이 없습니다. 특히 Guice 모듈 내의 싱글 톤은 Injector.getInstance()에 의해 얻어 지지만 사용 된 후에는 닫히지 않아야합니다. – ripper234

+1

이 모든 문제는 당신이하고있는 일과 상황에 달려 있습니다. 다른 객체에는 다른 수명주기, 다른 범위 등이 있으므로 catch-all 쉬운 해결책은 없습니다. 웹 응용 프로그램에서이 작업을 수행하고 있습니까? 주로 종료 할 때 싱글 톤을 닫는 것에 대해 이야기하고 있습니까? – ColinD