Учебники

Google Guice – Области применения

Guice возвращает новый экземпляр каждый раз, когда он задает значение в качестве поведения по умолчанию. Это настраивается с помощью областей. Ниже приведены области, которые поддерживает Guice.

  • @Singleton – один экземпляр на весь срок действия приложения. Объект @Singleton должен быть потокобезопасным.

  • @SessionScoped – один экземпляр для определенного сеанса веб-приложения. Объект @SessionScoped должен быть потокобезопасным.

  • @RequestScoped – один экземпляр для конкретного запроса веб-приложения. Объект @RequestScoped не должен быть потокобезопасным.

@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;
}

пример

Давайте посмотрим Scope на уровне класса в действии.

Результат с аннотацией @Singleton

Создайте Java-класс с именем GuiceTester.

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

Создайте Java-класс с именем GuiceTester.

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;
   }
}

Скомпилируйте и запустите файл, вы можете увидеть следующий вывод с разными номерами.