3. Google Guice의 범위

기본적으로 Guice는 인스턴스를 가져올 때마다 새 객체를 반환합니다. 이 동작은 범위를 통해 구성 할 수 있습니다. 범위를 사용하면 인스턴스를 재사용 할 수 있습니다. 애플리케이션 수명주기 ( @Singleton), 세션 ( @Session), 요청 ( @RequestScoped), Guice는 웹 애플리케이션에 대한 Servlet확장 된 범위 도 제공합니다 . 그리고 Guice에서 범위를 사용자 지정할 수 있습니다.

Guice는 어노테이션을 사용하여 범위를 식별하고 특정 유형의 구현 클래스에 어노테이션을 추가합니다.

@Singleton
public class InMemoryTransactionLog implements TransactionLog {
  /* everything here should be threadsafe! */
}

범위는 bind명령문을 사용하여 구성 할 수도 있습니다 .

bind(TransactionLog.class).to(InMemoryTransactionLog.class).in(Singleton.class);

@Provides범위 주석을 추가하는 방법 :

@Provides @Singleton
    TransactionLog provideTransactionLog() {
    ...
}

범위를 구성 할 때 주석 사용과 설명 bind()사이에 충돌이 있으면 bind()의 구성이 우선합니다. 특정 유형이 범위를 지정하지 않으려면 사용할 수 있습니다 Scopes.NO_SCOPE.

링크 바인딩에서 범위는 바인딩 대상이 아닌 바인딩 소스에 적용됩니다. 인터페이스 Appleess를 구현 하는 클래스 가있는 경우 다음 바인딩 구성의 두 인스턴스가 있습니다. 하나는에 대한 것이고 다른 하나는에 대한 것입니다 .BarGrillBarGrill

bind(Bar.class).to(Applebees.class).in(Singleton.class);
bind(Grill.class).to(Applebees.class).in(Singleton.class);

이는 범위가 바인딩 대상 ( )이 아닌 바인딩 소스 ( Bar, Grill)에 적용되기 때문 Appless입니다. 하나의 인스턴스 만 생성해야하는 경우 Appless클래스에 @Singleton주석을 추가하거나 다른 바인딩 구성을 추가 할 수 있습니다 .

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

이 바인딩 구성은 두 개의 .in(Singleton.class)문을 중복시킵니다. in()문은 Scope 주석을받을 수있을뿐만 아니라 다음 RequestScope.class과 같은 Scope 인스턴스도받을 수 있습니다 ServletScopes.REQUEST.

bind(UserPreferences.class)
      .toProvider(UserPreferencesProvider.class)
      .in(ServletScopes.REQUEST);

Module객체가 이러한 방식으로 재사용되기 때문에 주석을 사용하여 범위를 구성하는 것이 더 적절합니다 .

Guice에는 즉시 생성해야하는 싱글 톤 객체 (Eager Singletons)를 정의하는 특수 구문이 있습니다. bind(TransactionLog.class).to(InMemoryTransactionLog.class).asEagerSingleton();
Eager Singletons 객체는 최종 사용자에게 일관된 경험을 보장하고 Lazy 싱글 톤은 편집-컴파일 실행 개발주기에 더 적합합니다. Stage 열거를 통해 사용할 전략을 선택할 수 있습니다.

생산 개발
.asEagerSingleton () 심한 심한
.in (싱글 톤. 클래스) 심한 게으른
.in (Scopes.SINGLETON) 심한 게으른
@하나씩 일어나는 것 심한* 게으른

*이 기호는 알려진 유형 만 단일 객체를 즉시 생성한다는 것을 의미하며, 이른바 알려진 유형은 Module사용되는 클래스와 이러한 클래스의 전이 종속성입니다.

범위를 선택하는 방법 :

객체가 상태 저장 인 경우 모든 애플리케이션 사용에 @Singleton대해 이고 모든 요청 사용에 대해 입니다 @RequestScoped. 객체가 상태 비 저장이고 생성 비용이 적 으면 범위를 구성 할 필요가 없으며 Guice는 매번 새 객체를 만듭니다.

싱글 톤 패턴은 Java 애플리케이션에서 매우 널리 사용되지만 특히 종속성 주입이 사용 된 후에는 여러 객체를 제공 할 수 없습니다. 싱글 톤 모드는 객체 생성을 줄이고 가비지 컬렉션을 지연하지만 싱글 톤 객체의 초기화는 동기화되어야합니다. Singleton 객체는 다음에 가장 적합합니다.

  1. 상태 저장 개체 (구성된 개체 또는 카운터 인 경우)
  2. 만들거나 찾는 데 많은 비용이 듭니다.
  3. 데이터베이스 연결 풀과 같은 리소스와 함께 번들로 제공되는 개체

클래스가 추가 @Singleton되거나 @SessionScoped주석 이 추가되면 스레드로부터 안전해야합니다. 그리고이 클래스에 주입되는 클래스도 안전해야하며 가변성을 최소화하기 위해 동시성 제어 상태의 필요성을 제한해야합니다. @RequestScoped객체가 반드시 스레드로부터 안전하지는 않으므로 @Singleton또는 @SessionScoped객체가 객체에 의존 한다는 일반적인 실수가 @RequestScoped있습니다.
-------------------------------- END ----------------- --------------

더 흥미로운 기사를 보려면 공개 계정 "Java Essentials"에 주목하십시오.

추천

출처blog.51cto.com/xtayfjpk/2668771