Google Guice-범위
Guice는 기본 동작으로 값을 제공 할 때마다 새 인스턴스를 반환합니다. 범위를 통해 구성 할 수 있습니다. 다음은 Guice가 지원하는 범위입니다.
@Singleton-애플리케이션 수명 동안 단일 인스턴스. @Singleton 객체는 스레드로부터 안전해야합니다.
@SessionScoped-웹 애플리케이션의 특정 세션에 대한 단일 인스턴스. @SessionScoped 개체는 스레드로부터 안전해야합니다.
@RequestScoped-웹 애플리케이션의 특정 요청에 대한 단일 인스턴스. @RequestScoped 개체는 스레드로부터 안전 할 필요가 없습니다.
범위를 적용하는 방법.
다음은 범위를 적용하는 방법입니다.
클래스 수준에서
@Singleton
class SpellCheckerImpl implements SpellChecker {
public SpellCheckerImpl(){}
@Override
public void checkSpelling() {
System.out.println("Inside checkSpelling." );
}
}
구성 수준에서
bind(SpellChecker.class).to(SpellCheckerImpl.class).in(Singleton.class);
방법 수준에서
@Provides @Singleton
public SpellChecker provideSpellChecker(){
String dbUrl = "jdbc:mysql://localhost:5326/emp";
String user = "user";
int timeout = 100;
SpellChecker SpellChecker = new SpellCheckerImpl(dbUrl, user, timeout);
return SpellChecker;
}
예
작동중인 클래스 수준에서 범위를 살펴 보겠습니다.
@Singleton 주석을 사용한 결과
GuiceTester라는 Java 클래스를 만듭니다.
GuiceTester.java
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.Singleton;
public class GuiceTester {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new TextEditorModule());
SpellChecker spellChecker = new SpellCheckerImpl();
injector.injectMembers(spellChecker);
TextEditor editor = injector.getInstance(TextEditor.class);
System.out.println(editor.getSpellCheckerId());
TextEditor editor1 = injector.getInstance(TextEditor.class);
System.out.println(editor1.getSpellCheckerId());
}
}
class TextEditor {
private SpellChecker spellChecker;
@Inject
public void setSpellChecker(SpellChecker spellChecker){
this.spellChecker = spellChecker;
}
public TextEditor() { }
public void makeSpellCheck(){
spellChecker.checkSpelling();
}
public double getSpellCheckerId(){
return spellChecker.getId();
}
}
//Binding Module
class TextEditorModule extends AbstractModule {
@Override
protected void configure() {
bind(SpellChecker.class).to(SpellCheckerImpl.class);
}
}
interface SpellChecker {
public double getId();
public void checkSpelling();
}
@Singleton
class SpellCheckerImpl implements SpellChecker {
double id;
public SpellCheckerImpl(){
id = Math.random();
}
@Override
public void checkSpelling() {
System.out.println("Inside checkSpelling." );
}
@Override
public double getId() {
return id;
}
}
파일을 컴파일하고 실행하면 동일한 숫자로 다음 출력이 표시 될 수 있습니다.
0.3055839187063575
0.3055839187063575
@Singleton 주석이없는 결과
GuiceTester라는 Java 클래스를 만듭니다.
GuiceTester.java
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
public class GuiceTester {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new TextEditorModule());
SpellChecker spellChecker = new SpellCheckerImpl();
injector.injectMembers(spellChecker);
TextEditor editor = injector.getInstance(TextEditor.class);
System.out.println(editor.getSpellCheckerId());
TextEditor editor1 = injector.getInstance(TextEditor.class);
System.out.println(editor1.getSpellCheckerId());
}
}
class TextEditor {
private SpellChecker spellChecker;
@Inject
public void setSpellChecker(SpellChecker spellChecker){
this.spellChecker = spellChecker;
}
public TextEditor() { }
public void makeSpellCheck(){
spellChecker.checkSpelling();
}
public double getSpellCheckerId(){
return spellChecker.getId();
}
}
//Binding Module
class TextEditorModule extends AbstractModule {
@Override
protected void configure() {
bind(SpellChecker.class).to(SpellCheckerImpl.class);
}
}
interface SpellChecker {
public double getId();
public void checkSpelling();
}
class SpellCheckerImpl implements SpellChecker {
double id;
public SpellCheckerImpl(){
id = Math.random();
}
@Override
public void checkSpelling() {
System.out.println("Inside checkSpelling." );
}
@Override
public double getId() {
return id;
}
}
산출
파일을 컴파일하고 실행하면 다른 숫자로 다음 출력이 표시 될 수 있습니다.
0.556007079571739
0.22095011760351602