문제

두 바인딩에 어떤 범위가 있는지 궁금합니다.

bind(PermissionManager.class).in(Singleton.class);

그리고

bind(PermissionManager.class);

나는 JavaDocs를 읽었으며 다음과 같습니다.싱글톤의 경우:

/**
* Apply this to implementation classes when you want only one instance
* (per {@link Injector}) to be reused for all injections for that binding.
*
* @author crazybob@google.com (Bob Lee)
*/

범위가 없는 경우:

/**
* No scope; the same as not applying any scope at all.  Each time the
* Injector obtains an instance of an object with "no scope", it injects this
* instance then immediately forgets it.  When the next request for the same
* binding arrives it will need to obtain the instance over again.
*
* <p>This exists only in case a class has been annotated with a scope
* annotation such as {@link Singleton @Singleton}, and you need to override
* this to "no scope" in your binding.
*
* @since 2.0
*/

이것은 실제적인 의미에서 무엇을 의미합니까?싱글톤은 클라이언트별인가요 아니면 JVM별인가요?범위가 없으면 모든 인스턴스가 다릅니까?

도움이 되었습니까?

해결책

Gin의 실제적인 측면에서 싱글톤 범위는 클라이언트 인스턴스별로, 더 정확하게는 Ginjector 인스턴스별로 고려할 때 가장 적합합니다.두 개의 Ginjector를 만드는 실수를 저지르면 GWT.create인스턴스를 두 번 실행하면 각 Ginjector가 자신이 관리하는 인스턴스만 추적할 수 있으므로 인스턴스당 하나의 '싱글톤'을 갖게 될 가능성이 높습니다.

따라서 애플리케이션이 로드될 때마다 자체 싱글톤을 갖게 됩니다.사용자가 두 개의 다른 탭에서 동일한 애플리케이션을 두 번 열면 각 탭에는 자체 싱글톤이 있습니다.각 탭은 모든 클래스의 자체 복사본을 가지며 다른 창에서 통신하거나 메소드*를 호출할 수 없으므로 자체 JVM으로 간주할 수 있습니다.

범위가 없으면 그렇습니다. 기본적으로 각 인스턴스는 다릅니다.유형이 다음과 같은 경우 @Injected, 거기에는 새로운 인스턴스가 있을 것입니다. 하지만 만약 당신이 @InjectProvider 필드의 경우 전화할 때마다 get() 새로운 인스턴스를 얻을 수 있습니다.이는 새로 삽입된 여러 인스턴스를 쉽게 가져오는 데 도움이 될 수 있습니다.

싱글톤은 두 가지 주요 경우에 사용하는 것이 좋습니다.

  • 인스턴스가 여러 주입에서 공통되어야 하는 공유 상태를 유지하는 경우가 가장 일반적인 경우입니다.
  • 인스턴스를 생성하는 데 비용이 많이 드는 경우 - 서버에서 이는 종종 풀로 수행되므로 X개 이상의 개체가 생성되지 않지만 클라이언트의 비용이 많이 드는 개체는 많은 위젯이 있고 일반적으로 하나 이상의 뷰인 경향이 있습니다. 필요하지 않습니다.

* 다른 창에서 메소드를 호출하는 것이 가능하지만 이를 위해서는 단순히 객체를 앞뒤로 전달하는 것이 아니라 메시지를 게시하여 브라우저의 기능을 사용해야 합니다.

다른 팁

싱글 톤은 생성 한 최상위 Ginjector (그리고 대부분의 응용 프로그램에서 하나의 Ginjector 만 생성)만큼 한 번만 생성됩니다.

Unscoped 객체는 다른 객체에 종속성으로 주입 될 때마다 생성됩니다.그래서 모든 인스턴스는 다릅니다.실제로 바인드 (SomeClass.class)를 작성할 필요가 없습니다 (또는 바인더 DSL이 바인딩을 수행 할 수있는 다른 것들 중 하나를 수행하십시오).기본 생성자를 보내거나 생성자에 @Inject를 추가하면 GIN을 만들 수 있습니다.

일반적으로 옹이 또는 진기를 사용하는 경우 좋은 이유가없는 한 일을 unscoped로 남겨두고 싶습니다. Scopes에 대한 Guice 설명서를 읽는 것이 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top