기본적으로 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
를 구현 하는 클래스 가있는 경우 다음 바인딩 구성의 두 인스턴스가 있습니다. 하나는에 대한 것이고 다른 하나는에 대한 것입니다 .Bar
Grill
Bar
Grill
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 객체는 다음에 가장 적합합니다.
- 상태 저장 개체 (구성된 개체 또는 카운터 인 경우)
- 만들거나 찾는 데 많은 비용이 듭니다.
- 데이터베이스 연결 풀과 같은 리소스와 함께 번들로 제공되는 개체
클래스가 추가 @Singleton
되거나 @SessionScoped
주석 이 추가되면 스레드로부터 안전해야합니다. 그리고이 클래스에 주입되는 클래스도 안전해야하며 가변성을 최소화하기 위해 동시성 제어 상태의 필요성을 제한해야합니다. @RequestScoped
객체가 반드시 스레드로부터 안전하지는 않으므로 @Singleton
또는 @SessionScoped
객체가 객체에 의존 한다는 일반적인 실수가 @RequestScoped
있습니다.
-------------------------------- END ----------------- --------------
더 흥미로운 기사를 보려면 공개 계정 "Java Essentials"에 주목하십시오.