2010-05-22 4 views
3

Guice 싱글 톤 내가Guice Singleton을 테스트하는 방법?

IService ser = Guice.createInjector().getInstance(IService.class); 
System.out.println("ser=" + ser); 
ser = Guice.createInjector().getInstance(IService.class); 
System.out.println("ser=" + ser); 

가 단독으로 작동 할 것이라고 생각 나

첫 번째에 대한 이상한하지만 그것은

[email protected] 
[email protected] 

가 확인 반환, 그것은 쉽게해야 나던. 싱글

[email protected] 
[email protected] 

Injector injector = Guice.createInjector(); 
IService ser = injector.getInstance(IService.class); 
System.out.println("ser=" + ser); 
ser = injector.getInstance(IService.class); 
System.out.println("ser=" + ser); 

작품 그래서 내가 어떻게 그것을 통과 할 테스트는 모듈 인젝터 (싱글 톤에 대한 싱글)

정적 필드가해야합니까?

+6

질문 전제에 동의하지 않습니다. Guice 사용자 가이드를 읽었습니까? –

+3

나는 너무 지루했다. – IAdapter

답변

11

Guice를 사용하는 경우 JVM 당 정확히 하나의 인젝터를 만들어야합니다. 일반적으로 응용 프로그램의 진입 점 (즉, public static void main 메서드)에 만듭니다. 응용 프로그램에서 createInjector 번을 여러 번 호출하면 Guice를 잘못 사용했을 수 있습니다!

싱글 톤은 인젝터 당 인스턴스입니다. 이 값은 이 아니고 인스턴스 당 JVM입니다. 싱글 톤에 대한 참조를 얻는 가장 좋은 방법은 싱글 톤을 삽입하는 것입니다. 다른 방법은 하나의 인젝터 인스턴스에 요청하여 인스턴스를 제공하는 것입니다.

+0

내 jvm에 두 개의 인젝터가 필요하다고 가정 해 봅시다. 문제가 생길까요? – Somatik

+0

다른 모듈에 대해 여러 개의 createInjector를 사용할 수 있습니까? –

+0

여러 인젝터와 모듈을 만드는 것에 대해 묻는 분들은 가능합니다. 나는 레거시 코드와 DI를 통합 할 수있는 독특한 상황을 가지고 있습니다. 시스템에 대한 각각의 애드온은 자체 Injector를 가지고 있습니다. 인젝터에서 싱글 톤이 필요한 경우 내 모듈이 자체 인젝터를 통해 싱글 톤 클래스를 제공하는 oldschool 싱글 톤 모듈을 만듭니다. – LudgerP

0

이와 같은 거친 부정확 한 비난을하기 전에 실제로 더 많은 테스트 (및 읽기)가 필요합니다. Guice를 사용하여 내 싱글 톤 인스턴스를 잘 관리합니다.

모듈 바인딩은 어떤 모양입니까? GoF의 싱글 톤 패턴은 클래스의 인스턴스가 하나만 있음을 보장하는 방법 일 뿐이지 만 static을 사용하면 실제로 나쁜 선택이됩니다. 싱글 톤의 필요성은 응용 프로그램이 실행되는 동안 클래스의 인스턴스가 하나만 존재한다는 것입니다. 다음

모두가 Guice 사용하여 싱글 인스턴스를 생성 할 필요가있다 :

public class myModule extends AbstractModule { 
    protected void configure() { 
     bind(Service.class).to(ServiceImpl.class).in(Singleton.class); 
    } 
} 

당신에게 인스턴스를 제공하기 위해 Guice을 물어 보면 당신이 자신을 범위 지정 독특한을하지 않는 한, 당신은 동일한 인스턴스를 얻을 수 있습니다 . 기본적으로 싱글 톤은 현재 Injector 인스턴스에 대한 것입니다.

+0

나는 Guice가 정적으로 참조를 보유한다고 생각한다. (그들은 항상 페이지의 비디오에 새로운 인젝터를 생성하기 때문에) – IAdapter

+0

사실 Guice가 작동하는 방식이 아니라는 것이 사실이다. Guice는 객체 생성 및 객체 종속성 그래프의 연결 과정에만 관여합니다. 그런 일이 생기면 사라집니다. "정적"싱글 톤은 존재하지 않으며 단지 그것을 사용하거나 필요로하는 다른 인스턴스로 전달되는 동일한 객체 참조 일뿐입니다. 정적 개념은 언어를 직접 사용하는 방법 이었지만, DI는 정적 상태를 사용하는 비용없이 똑같은 것을 허용함으로써 언어의 "결점"을 해결합니다. – gpampara

+0

그가 말한 것은 정확하지 않습니다. 싱글 톤은 인젝터간에 공유되지 않습니다. 두 개의 개별 인젝터를 만들고 그 중 하나에서 단일 범위 객체를 요청하면 다른 객체가됩니다. 또한 마지막 문장이 틀립니다. 기본값으로 싱글 톤은 현재 인젝터 인스턴스에 대해 VM 인스턴스가 아닙니다. – LudgerP