Google Guice 분석
Presto를 분포식 즉석 조회 엔진으로 사용했는데 그 중에서 플러그인 관련 관리는 기본적으로 Guice 주입 프레임워크를 이용하여 플러그인의 생명주기 관리를 하기 때문에 여기서 Guice를 간단하게 분석한다.일반 클래스 설명
클래스 이름
설명
Guice
프레임 등록 포털
Injector
주입기 성명 주류
Binder
인터페이스 클래스와 실현 사이의 귀속기
Module
Binder 관계 클래스 관리 및 설정
Provider
Module의 구성 효과와 일치하는 서비스 공급자 주입
Key
provider 키 이름,spring에서 Bean의 이름과 유사하며,provider와 일대일 관계
Scope
Provider의 역할 범위
따라서 다음과 같이 간단하게 이해할 수 있다.
@inject 표시를 사용하여 완성할 수 있음Module 대상import com.google.inject.AbstractModule;
public class BasicModule extends AbstractModule {
@Override
protected void configure() {
// ILogger LoggerImpl
bind(Key.get(ILogger.class, Names.named("ilogger1"))).to(LoggerImpl.class);
bind(Key.get(ILogger.class, Names.named("ilogger2"))).to(Logger2Impl.class);
// , , Provider
bind(ILogger.class).annotatedWith(Names.named("ilogger1")).toProvider(new Provider() {
@Override
public ILogger get() {
return new LoggerImpl();
}
});
// Logger new Logger(true)
bind(Logger.class).toInstance(new Logger(true));
}
}
public class BasicModule extends AbstractModule {
@Override
protected void configure() {
bind(Logger.class).toInstance(new Logger(true));
}
@Provides
@Singleton
@Named("ilogger1")
public ILogger getILogger1() {
return new LoggerImpl();
}
@Provides
@Singleton
@Named("ilogger2")
public ILogger getILogger2() {
return new Logger2Impl();
}
}
public class StringModule extends AbstractModule {
@Override
protected void configure() {
// String "jdbc:phoenix:localhost:2181/hbase"
bind(String.class).annotatedWith(Names.named("url")).toInstance("jdbc:phoenix:localhost:2181/hbase");
}
}
다중 실현 인터페이스 정의 및 사용 과정 중 @Named 주석을 통해 명칭 귀속을 해야 한다. 그렇지 않으면 A binding to XXX was already configured at YYYpublic interface ILogger {
boolean log(String message);
}
public class LoggerImpl implements ILogger {
public boolean log(String message) {
System.out.println("Logger Message: " + message);
return true;
}
}
public class Logger2Impl implements ILogger {
public boolean log(String message) {
System.out.println("Logger2 Message: " + message);
return true;
}
}
import com.google.inject.*;
import com.google.inject.name.Named;
import java.util.Map;
public class Logger {
private boolean hasEnabled;
@Inject
@Named("ilogger1")
private ILogger iLogger1;
@Inject
@Named("ilogger2")
private ILogger iLogger2;
public Logger(boolean enabled) {
if (enabled) {
hasEnabled = enabled;
System.out.println("Logger has enabled");
}
}
public boolean log(String message) {
if (hasEnabled) {
iLogger1.log(message);
}
return true;
}
public boolean log2(String message) {
if (hasEnabled) {
iLogger2.log(message);
}
return true;
}
public static void main(String[] args) {
// : BasicModule StringModule
Injector injector = Guice.createInjector(new BasicModule(), new StringModule());
Logger logger = injector.getInstance(Logger.class);
String url = injector.getInstance(Key.get(String.class, Names.named("url")));
logger.log("hello world 111");
logger.log2("hello world 222");
System.out.println("******" + url + "******");
System.out.println();
Map, Binding>> bindings = injector.getAllBindings();
for (Map.Entry, Binding>> bingingEntry : bindings.entrySet()) {
Binding binging = bingingEntry.getValue();
Key key = binging.getKey();
Provider provider = binging.getProvider();
System.out.println("Key: " + key.toString());
System.out.println("Provider: " + provider.get().getClass());
System.out.println("************");
}
}
}
출력은 다음과 같습니다.
Logger has enabled
Logger Message: hello world 111
Logger2 Message: hello world 222
******jdbc:phoenix:localhost:2181/hbase******
Key: Key[type=com.google.inject.Stage, annotation=[none]]
Provider: class com.google.inject.Stage
************
Key: Key[type=com.google.inject.Injector, annotation=[none]]
Provider: class com.google.inject.internal.InjectorImpl
************
Key: Key[type=java.util.logging.Logger, annotation=[none]]
Provider: class java.util.logging.Logger
************
Key: Key[type=com.devhub.guice.Logger, annotation=[none]]
Provider: class com.devhub.guice.Logger
************
Key: Key[type=com.devhub.guice.ILogger, [email protected](value=ilogger1)]
Provider: class com.devhub.guice.LoggerImpl
************
Key: Key[type=com.devhub.guice.ILogger, [email protected](value=ilogger2)]
Provider: class com.devhub.guice.Logger2Impl
************
Key: Key[type=com.devhub.guice.Logger2Impl, annotation=[none]]
Provider: class com.devhub.guice.Logger2Impl
************
Key: Key[type=com.devhub.guice.LoggerImpl, annotation=[none]]
Provider: class com.devhub.guice.LoggerImpl
************
Process finished with exit code 0
다중 실현 인터페이스 사용은 정의와 일치해야 하며, @Named 주석을 사용하여 명칭을 표시해야 한다. 상기 예에서 보듯이 Named에서 정의한 이름은 Key에 저장되어 서로 다른 실현을 구별한다. 상술한 바와 같이 여러 개의 모듈을 동시에 주입할 수 있고 각각의 모듈은 서로 다른 내용을 설정하여 인터페이스를 여러 가지 유형으로 실현하여 모듈의 공용을 편리하게 할 수 있다.Gradle 의존 라이브러리
compile group: 'com.google.inject', name: 'guice', version: '4.2.2'
참고 자료
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.