2013-07-05 1 views
2

를 사용하지 않고 싱글의 인스턴스를 얻기 위해 어떻게 싱글 톤 클래스를 가지고 같이 정의 :Guice는 : 인젝터 또는 생성자 삽입

@Singleton 
class MySingletonClass{ 
    .... 
} 

나는이 싱글 톤 클래스를 사용하는 다른 클래스가 있지만,이 클래스는 사용하여 작성해야합니다 새로운 연산자. 따라서 나는 확실히 MyClass의 생성자에이의 인스턴스를 전달할 수 등

class MyClass { 
    public void method() { 
     // Uses instnace of MySingletonClass 
    } 
} 

생성자 주입 또는 세터 주입을 사용할 수 있지만 내 프로그램의 맥락에서 꽤 좋은 디자인을하지 않습니다.

또 다른 해결책은 MySingletonClass에 대한 정적 getInstance 메소드를 작성하여 프로그램의 어느 곳에서나 인스턴스를 얻을 수있게하는 것입니다. 하지만 Guice가 이와 비슷한 것을 지원하는지 알고 싶습니다. Guice가 어디서든 싱글 톤 인스턴스를 허용 할 수 있다고 확신합니다.

감사합니다.

+0

* guice는 어디서든 싱글 톤 인스턴스를 가져올 수 있습니다. * Guice는 DI 컨테이너이므로 마술을 할 수는 있지만 conainer 내부에서만 가능하며이 컨테이너는'Injector' 인스턴스입니다. 암시 적으로 (컨테이너 내부에서 생성자 삽입을 통해) 또는 명시 적으로 (getInstance() 메소드를 통해) 액세스해야합니다. 결과적으로 클래스를 DI 컨트롤에 배치하거나 종속성을 수동으로 전달해야합니다. 첫 번째 해결 방법이 분명 좋습니다. –

+0

답장을 보내 주셔서 감사합니다. 인젝터 인스턴스는 응용 프로그램의 최상위 수준 (예 : main 메소드)에서 전역 적으로 한 번 만들어야합니다. 하지만 거기에 명시 적으로 주 클래스에서 만든 인스턴스를 모든 클래스에 전달하지 않고 응용 프로그램에서 Injector 인스턴스를 얻을 수있는 방법이 있습니까? – Kevin

+2

아니요, 없습니다. 결국 인젝터는 단순한 물체입니다. BTW, 하나 이상의 인젝터가있을 수 있으며, 그들은 계층 구조를 형성 할 수 있습니다. 그러면 전체 프로그램에서 어느 것이 사용 가능해야합니까? 'Injector' 인스턴스를 명시 적으로 전달하지 않고 얻을 수있는 유일한 방법은이를 관리되는 클래스 중 하나에 주입하는 것입니다. –

답변

4

myClass에 MySingletonClass가 필요한 경우 이는 명확한 종속성이 있음을 의미하므로 올바른 해결 방법은 MySingletonClass의 인스턴스를 MyClass의 생성자에 전달하는 것입니다.

생성자 주입은 종속성을 명시 적으로 지정하고 충족되지 않은 종속성이있는 MyClass 생성을 방지하므로 가장 바람직한 주입 방법 중 하나입니다. 정말로 생성자 주입이 마음에 들지 않으면 MySingletonClass 인스턴스를 수동으로 주입 할 수있는 설정 주입을 항상 사용할 수 있습니다.

+0

답해 주셔서 감사합니다. My code의 디자인은 MySingltonClass의 인스턴스를 MyClass로 넘기는 것을 금지합니다. 또한 Guice의 인젝터를 어디서나 사용할 수 있는지 알고 싶습니다. 그렇다면 단순히 injector.getInstance (MySingletonClass.class)를 호출 할 수 있습니다. – Kevin

+1

재미 있긴하지만 Guice는 인젝터를 얻는 것을 정말로 허용하지만 다른 의존성과 마찬가지로 주입해야합니다. 만약 당신이 * 정말로 * 의존성 주입을 사용하기 위해 코드를 변경할 수 없다면, 가장 좋은 방법은 인스턴스화 된 클래스에 수동으로 싱글 톤을 전달하는 것입니다. 이 클래스가이 싱글 톤 이상에만 의존하는 경우 [주문형 주입] (http://code.google.com/p/google-guice/wiki/Injections#On-demand_Injection)을 대신 사용해보십시오. –