Google Guice - Hızlı Kılavuz

Guice, açık kaynaklı, Java tabanlı bir bağımlılık enjeksiyon çerçevesidir. Sessiz ve hafiftir ve Google tarafından aktif olarak geliştirilir / yönetilir.

Bağımlılık Enjeksiyonu

Her Java tabanlı uygulamanın, son kullanıcının çalışan bir uygulama olarak gördüklerini sunmak için birlikte çalışan birkaç nesnesi vardır. Karmaşık bir Java uygulaması yazarken, bu sınıfları yeniden kullanma olasılığını artırmak ve birim testi sırasında bunları diğer sınıflardan bağımsız olarak test etmek için uygulama sınıfları diğer Java sınıflarından olabildiğince bağımsız olmalıdır. Bağımlılık Enjeksiyonu (veya bazen kablolama olarak adlandırılır), bu sınıfları birbirine yapıştırmaya ve aynı zamanda bağımsız tutmaya yardımcı olur.

Metin düzenleyici bileşeni olan bir uygulamanız olduğunu ve bir yazım denetimi sağlamak istediğinizi düşünün. Standart kodunuz şuna benzer -

public class TextEditor {
   private SpellChecker spellChecker;
   
   public TextEditor() {
      spellChecker = new SpellChecker();
   }
}

Burada yaptığımız şey, TextEditor ve SpellChecker arasında bir bağımlılık yaratmaktır. Kontrol senaryosunun tersine çevrilmesinde, bunun yerine şöyle bir şey yapardık -

public class TextEditor {
   private SpellChecker spellChecker;
   
   @Inject
   public TextEditor(SpellChecker spellChecker) {
      this.spellChecker = spellChecker;
   }
}

Burada TextEditor, SpellChecker uygulaması konusunda endişelenmemelidir. Yazım Denetimi bağımsız olarak uygulanacak ve TextEditor somutlaştırması sırasında TextEditor'a sağlanacaktır.

Guice kullanarak Bağımlılık Enjeksiyonu (Bağlama)

Bağımlılık Enjeksiyonu, Guice Bindings tarafından kontrol edilir. Guice, nesne türlerini gerçek uygulamalarıyla eşlemek için bağlamaları kullanır. Bu bağlamalar bir modül olarak tanımlanır. Bir modül, aşağıda gösterildiği gibi bir bağlama koleksiyonudur:

public class TextEditorModule extends AbstractModule {
   @Override 
   protected void configure() {
      /*
      * Bind SpellChecker binding to WinWordSpellChecker implementation 
      * whenever spellChecker dependency is used.
      */
      bind(SpellChecker.class).to(WinWordSpellChecker.class);
   }
}

Modül, Guice'nin nesne grafiği oluşturucusu olan Enjektör için temel yapı taşıdır. İlk steo, bir enjektör oluşturmaktır ve ardından nesneleri almak için enjektörü kullanabiliriz.

public static void main(String[] args) {
   /*
   * Guice.createInjector() takes Modules, and returns a new Injector
   * instance. This method is to be called once during application startup.
   */
   Injector injector = Guice.createInjector(new TextEditorModule());
   /*
   * Build object using injector
   */
   TextEditor textEditor = injector.getInstance(TextEditor.class);   
}

Yukarıdaki örnekte, TextEditor sınıfı nesne grafiği Guice tarafından oluşturulmuştur ve bu grafik TextEditor nesnesini ve WinWordSpellChecker nesnesi olarak bağımlılığını içerir.

Yerel Ortam Kurulumu

Hala ortamınızı Java programlama dili için kurmaya istekliyseniz, bu bölüm Java'yı makinenize nasıl indirip kuracağınız konusunda size yol gösterir. Ortamı kurmak için lütfen aşağıda belirtilen adımları izleyin.

Java SE, Java İndirme bağlantısından ücretsiz olarak edinilebilir . Böylece işletim sisteminize göre bir sürüm indirirsiniz.

Java'yı indirmek için talimatları izleyin ve .exeMakinenize Java yüklemek için. Java'yı makinenize yükledikten sonra, ortam değişkenlerini doğru yükleme dizinlerini gösterecek şekilde ayarlamanız gerekir -

Windows 2000 / XP için Yolun Ayarlanması

Java'yı c: \ Program Files \ java \ jdk dizinine yüklediğinizi varsayıyoruz -

  • "Bilgisayarım" ı sağ tıklayın ve "Özellikler" i seçin.

  • "Gelişmiş" sekmesinin altındaki "Ortam değişkenleri" düğmesini tıklayın.

  • Şimdi, 'Yol' değişkenini, Java yürütülebilir dosyasının yolunu da içerecek şekilde değiştirin. Örneğin, yol şu anda 'C: \ WINDOWS \ SYSTEM32' olarak ayarlanmışsa, yolunuzu 'C: \ WINDOWS \ SYSTEM32; c: \ Program Files \ java \ jdk \ bin' olarak değiştirin.

Windows 95/98 / ME için Yolun Ayarlanması

Java'yı c: \ Program Files \ java \ jdk dizinine yüklediğinizi varsayıyoruz -

  • 'C: \ autoexec.bat' dosyasını düzenleyin ve sonuna şu satırı ekleyin - 'SET PATH =% PATH%; C: \ Program Files \ java \ jdk \ bin'

Linux, UNIX, Solaris, FreeBSD için Yolun Ayarlanması

PATH ortam değişkeni, Java ikili dosyalarının kurulu olduğu yeri gösterecek şekilde ayarlanmalıdır. Bunu yapmakta sorun yaşıyorsanız, kabuk belgelerinize bakın.

Örneğin, kabuğunuz olarak bash kullanırsanız, aşağıdaki satırı '.bashrc: export PATH = / path / to / java: $ PATH'in sonuna eklersiniz.

Popüler Java Editörleri

Java programlarınızı yazmak için bir metin düzenleyiciye ihtiyacınız var. Piyasada birçok sofistike IDE bulunmaktadır. Ancak şimdilik aşağıdakilerden birini düşünebilirsiniz -

  • Notepad - Windows makinede, Not Defteri (Bu eğitim için önerilir), TextPad gibi herhangi bir basit metin düzenleyiciyi kullanabilirsiniz.

  • Netbeans - Açık kaynak kodlu ve ücretsiz bir Java IDE'dir, buradan indirilebilir https://www.netbeans.org/index.html.

  • Eclipse - Eclipse açık kaynak topluluğu tarafından geliştirilmiş bir Java IDE'dir ve şu adresten indirilebilir: https://www.eclipse.org/.

Google Guice Ortamı

Google Guice'nin en son sürümünü ve ilgili jar dosyalarını indirin.

  • Google Guice 4.0

  • AOP Alliance 1.0

  • Guava 16.0.1

  • javax.inject 1.0

Bu öğreticiyi yazarken, onları C: \> Google klasörüne kopyaladık.

işletim sistemi Arşiv adı
pencereler guice-4.1.0.jar; aopalliance-1.0.jar; guava-16.0.1.jar; javax.inject-1.jar
Linux guice-4.1.0.jar; aopalliance-1.0.jar; guava-16.0.1.jar; javax.inject-1.jar
Mac guice-4.1.0.jar; aopalliance-1.0.jar; guava-16.0.1.jar; javax.inject-1.jar

CLASSPATH Değişkenini Ayarla

Yı kur CLASSPATHGuice kavanoz konumunu işaret edecek ortam değişkeni. Varsayalım ki, Guice ve ilgili kavanozları aşağıdaki gibi çeşitli İşletim Sistemlerinde Google klasöründe sakladınız.

işletim sistemi Çıktı
pencereler CLASSPATH ortam değişkenini% CLASSPATH%; C: \ Google \ guice-4.1.0.jar; C: \ Google \ aopalliance-1.0.jar; C: \ Google \ guava-16.0.1.jar; C: \ olarak ayarlayın Google \ javax.inject-1.jar;.;
Linux dışa aktar CLASSPATH = $ CLASSPATH: Google / guice-4.1.0.jar: Google / aopalliance-1.0.jar: Google / guava-16.0.1.jar: Google / javax.inject-1.jar :.
Mac dışa aktar CLASSPATH = $ CLASSPATH: Google / guice-4.1.0.jar: Google / aopalliance-1.0.jar: Google / guava-16.0.1.jar: Google / javax.inject-1.jar :.

Guice bağlama mekanizmasını kullanarak adım adım bağımlılık enjeksiyonunu göstereceğimiz örnek bir konsol tabanlı uygulama oluşturalım.

Adım 1: Arayüz Oluşturun

//spell checker interface
interface SpellChecker {
   public void checkSpelling();
}

Adım 2: Uygulama Oluşturun

//spell checker implementation
class SpellCheckerImpl implements SpellChecker {
   @Override
   public void checkSpelling() {
      System.out.println("Inside checkSpelling." );
   } 
}

3. Adım: Bağlama Modülü Oluşturun

//Binding Module
class TextEditorModule extends AbstractModule {
   @Override
   protected void configure() {
      bind(SpellChecker.class).to(SpellCheckerImpl.class);
   } 
}

Adım 4: Bağımlılıkla Sınıf Oluşturun

class TextEditor {
   private SpellChecker spellChecker;
   @Inject
   public TextEditor(SpellChecker spellChecker) {
      this.spellChecker = spellChecker;
   }
   public void makeSpellCheck(){
      spellChecker.checkSpelling();
   }
}

Adım 5: Enjektör Oluşturun

Injector injector = Guice.createInjector(new TextEditorModule());

Adım 6: Bağımlılık yerine getirilmiş Object'i alın

TextEditor editor = injector.getInstance(TextEditor.class);

7. Adım: Nesneyi kullanın.

editor.makeSpellCheck();

Tam Örnek

GuiceTester adlı bir java sınıfı oluşturun.

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());
      TextEditor editor = injector.getInstance(TextEditor.class);
      editor.makeSpellCheck(); 
   } 
}

class TextEditor {
   private SpellChecker spellChecker;

   @Inject
   public TextEditor(SpellChecker spellChecker) {
      this.spellChecker = spellChecker;
   }

   public void makeSpellCheck(){
      spellChecker.checkSpelling();
   }
}

//Binding Module
class TextEditorModule extends AbstractModule {

   @Override
   protected void configure() {
      bind(SpellChecker.class).to(SpellCheckerImpl.class);
   } 
}

//spell checker interface
interface SpellChecker {
   public void checkSpelling();
}


//spell checker implementation
class SpellCheckerImpl implements SpellChecker {

   @Override
   public void checkSpelling() {
      System.out.println("Inside checkSpelling." );
   } 
}

Çıktı

Dosyayı derleyin ve çalıştırın, aşağıdaki çıktıyı göreceksiniz.

Inside checkSpelling.

Bağlantılı bağlamalarda, Guice bir türü uygulamasına eşler. Aşağıdaki örnekte, SpellCheckerImpl uygulaması ile SpellChecker arayüzünü eşledik.

bind(SpellChecker.class).to(SpellCheckerImpl.class);

Ayrıca beton sınıfını alt sınıfıyla eşleştirebiliriz. Aşağıdaki örneğe bakın:

bind(SpellCheckerImpl.class).to(WinWordSpellCheckerImpl.class);

Burada bağları zincirledik. Sonucu eksiksiz bir örnekle görelim.

Tam Örnek

GuiceTester adlı bir java sınıfı oluşturun.

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());
      TextEditor editor = injector.getInstance(TextEditor.class);
      editor.makeSpellCheck(); 
   } 
}

class TextEditor {
   private SpellChecker spellChecker;

   @Inject
   public TextEditor(SpellChecker spellChecker) {
      this.spellChecker = spellChecker;
   }

   public void makeSpellCheck(){
      spellChecker.checkSpelling();
   }
}

//Binding Module
class TextEditorModule extends AbstractModule {

   @Override
   protected void configure() {
      bind(SpellChecker.class).to(SpellCheckerImpl.class);
      bind(SpellCheckerImpl.class).to(WinWordSpellCheckerImpl.class);
   } 
}

//spell checker interface
interface SpellChecker {
   public void checkSpelling();
}


//spell checker implementation
class SpellCheckerImpl implements SpellChecker {

   @Override
   public void checkSpelling() {
      System.out.println("Inside checkSpelling." );
   } 
}

//subclass of SpellCheckerImpl
class WinWordSpellCheckerImpl extends SpellCheckerImpl{
   @Override
   public void checkSpelling() {
      System.out.println("Inside WinWordSpellCheckerImpl.checkSpelling." );
   } 
}

Çıktı

Dosyayı derleyin ve çalıştırın, aşağıdaki çıktıyı göreceksiniz.

Inside WinWordSpellCheckerImpl.checkSpelling.

Bir türü uygulamasıyla bağlayabileceğimiz gibi. Bir türü birden çok uygulamayla eşlemek istememiz durumunda, özel açıklama da oluşturabiliriz. Kavramı anlamak için aşağıdaki örneğe bakın.

Bir ciltleme ek açıklaması oluşturun

@BindingAnnotation @Target({ FIELD, PARAMETER, METHOD }) @Retention(RUNTIME)
@interface WinWord {}
  • @BindingAnnotation - Ek açıklamayı bağlayıcı açıklama olarak işaretler.

  • @Target - Ek açıklamanın uygulanabilirliğini işaretler.

  • @Retention - Ek açıklamanın kullanılabilirliğini çalışma zamanı olarak işaretler.

Bağlama açıklamasını kullanarak eşleme

bind(SpellChecker.class).annotatedWith(WinWord.class).to(WinWordSpellCheckerImpl.class);

Bağlama açıklamasını kullanarak enjekte edin

@Inject
public TextEditor(@WinWord SpellChecker spellChecker) {
   this.spellChecker = spellChecker;
}

Tam Örnek

GuiceTester adlı bir java sınıfı oluşturun.

GuiceTester.java

import java.lang.annotation.Target;

import com.google.inject.AbstractModule;
import com.google.inject.BindingAnnotation;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;

import java.lang.annotation.Retention;

import static java.lang.annotation.RetentionPolicy.RUNTIME;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;

@BindingAnnotation @Target({ FIELD, PARAMETER, METHOD }) @Retention(RUNTIME)
@interface WinWord {}

public class GuiceTester {
   public static void main(String[] args) {
      Injector injector = Guice.createInjector(new TextEditorModule());
      TextEditor editor = injector.getInstance(TextEditor.class);
      editor.makeSpellCheck();     
   } 
}

class TextEditor {
   private SpellChecker spellChecker;   

   @Inject
   public TextEditor(@WinWord SpellChecker spellChecker) {
      this.spellChecker = spellChecker;
   }

   public void makeSpellCheck(){
      spellChecker.checkSpelling(); 
   } 
}

//Binding Module
class TextEditorModule extends AbstractModule {

   @Override
   protected void configure() {
      bind(SpellChecker.class).annotatedWith(WinWord.class)
         .to(WinWordSpellCheckerImpl.class);    
   } 
}

//spell checker interface
interface SpellChecker {
   public void checkSpelling();
}

//spell checker implementation
class SpellCheckerImpl implements SpellChecker {

   @Override
   public void checkSpelling() {
      System.out.println("Inside checkSpelling." );
   } 
}

//subclass of SpellCheckerImpl
class WinWordSpellCheckerImpl extends SpellCheckerImpl{
   @Override
   public void checkSpelling() {
      System.out.println("Inside WinWordSpellCheckerImpl.checkSpelling." );
   } 
}

Çıktı

Dosyayı derleyin ve çalıştırın, aşağıdaki çıktıyı göreceksiniz.

Inside WinWordSpellCheckerImpl.checkSpelling.

Guice, özel bir açıklama oluşturmadan bağlamaları eşlemek için başka bir yol sağlar. @ İsimlendirilmiş ek açıklamanın kullanılmasına izin verir.

Adlandırılmış ek açıklama kullanarak eşleme

bind(SpellChecker.class).annotatedWith(Names.named("OpenOffice")).to(OpenOfficeWordSpellCheckerImpl.class);

@Named annotation kullanarak enjekte edin

@Inject
public TextEditor(@Named("OpenOffice") SpellChecker spellChecker) {
   this.spellChecker = spellChecker;
}

Tam Örnek

GuiceTester adlı bir java sınıfı oluşturun.

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.name.Named;
import com.google.inject.name.Names;

public class GuiceTester {
   public static void main(String[] args) {
      Injector injector = Guice.createInjector(new TextEditorModule());
      TextEditor editor = injector.getInstance(TextEditor.class);
      editor.makeSpellCheck();
   } 
}

class TextEditor {
   private SpellChecker spellChecker;
   

   @Inject
   public TextEditor(@Named("OpenOffice") SpellChecker spellChecker) {
      this.spellChecker = spellChecker;      
   }

   public void makeSpellCheck(){
      spellChecker.checkSpelling(); 
   }  
}

//Binding Module
class TextEditorModule extends AbstractModule {

   @Override
   protected void configure() {
      bind(SpellChecker.class).annotatedWith(Names.named("OpenOffice"))
         .to(OpenOfficeWordSpellCheckerImpl.class);
   } 
}

//spell checker interface
interface SpellChecker {
   public void checkSpelling();
}

//spell checker implementation
class SpellCheckerImpl implements SpellChecker {

   @Override
   public void checkSpelling() {
      System.out.println("Inside checkSpelling." );
   } 
}

//subclass of SpellCheckerImpl
class OpenOfficeWordSpellCheckerImpl extends SpellCheckerImpl{
   @Override
   public void checkSpelling() {
      System.out.println("Inside OpenOfficeWordSpellCheckerImpl.checkSpelling." );
   } 
}

Çıktı

Dosyayı derleyin ve çalıştırın, aşağıdaki çıktıyı göreceksiniz.

Inside OpenOfficeWordSpellCheckerImpl.checkSpelling.

Guice, değer nesneleri veya sabitleri ile bağlar oluşturmanın bir yolunu sağlar. JDBC url'sini yapılandırmak istediğimiz durumu düşünün.

@Named annotation kullanarak enjekte edin

@Inject
public void connectDatabase(@Named("JBDC") String dbUrl) {
   //...
}

Bu, toInstance () yöntemi kullanılarak elde edilebilir.

bind(String.class).annotatedWith(Names.named("JBDC")).toInstance("jdbc:mysql://localhost:5326/emp");

Tam Örnek

GuiceTester adlı bir java sınıfı oluşturun.

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.name.Named;
import com.google.inject.name.Names;

public class GuiceTester {
   public static void main(String[] args) {
      Injector injector = Guice.createInjector(new TextEditorModule());
      TextEditor editor = injector.getInstance(TextEditor.class);
      editor.makeConnection();
   } 
}

class TextEditor {
   private String dbUrl;
   @Inject
   public TextEditor(@Named("JDBC") String dbUrl) {
      this.dbUrl = dbUrl;
   }

   public void makeConnection(){
      System.out.println(dbUrl);
   } 
}

//Binding Module
class TextEditorModule extends AbstractModule {

   @Override
   protected void configure() {
      bind(String.class)
         .annotatedWith(Names.named("JDBC"))
         .toInstance("jdbc:mysql://localhost:5326/emp");
   } 
}

Çıktı

Dosyayı derleyin ve çalıştırın, aşağıdaki çıktıyı göreceksiniz.

jdbc:mysql://localhost:5326/emp

Guice, @provides yöntemini kullanarak karmaşık nesnelerle bağlamalar oluşturmanın bir yolunu sağlar.

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

Bu yöntem, Bağlama Modülünün bir parçasıdır ve karmaşık nesnenin haritalanmasını sağlar. Aşağıdaki tam örneğe bakın.

Tam Örnek

GuiceTester adlı bir java sınıfı oluşturun.

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.Provides;

public class GuiceTester {
   public static void main(String[] args) {
      Injector injector = Guice.createInjector(new TextEditorModule());
      TextEditor editor = injector.getInstance(TextEditor.class);
      editor.makeSpellCheck();
   } 
}

class TextEditor {
   private SpellChecker spellChecker;
   @Inject
   public TextEditor( SpellChecker spellChecker) {
      this.spellChecker = spellChecker;
   }
   public void makeSpellCheck(){
      spellChecker.checkSpelling();
   } 
}

//Binding Module
class TextEditorModule extends AbstractModule {

   @Override
   protected void configure() {} 

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

//spell checker interface
interface SpellChecker {
public void checkSpelling();
}

//spell checker implementation
class SpellCheckerImpl implements SpellChecker {

   private String dbUrl;
   private String user;
   private Integer timeout;

   @Inject
   public SpellCheckerImpl(String dbUrl, 
      String user, 
      Integer timeout){
      this.dbUrl = dbUrl;
      this.user = user;
      this.timeout = timeout;
   } 

   @Override
   public void checkSpelling() { 
      System.out.println("Inside checkSpelling." );
      System.out.println(dbUrl);
      System.out.println(user);
      System.out.println(timeout);
   }
}

Çıktı

Dosyayı derleyin ve çalıştırın, aşağıdaki çıktıyı göreceksiniz.

Inside checkSpelling.
jdbc:mysql://localhost:5326/emp
user
100

@Provides yöntemi daha karmaşık hale geldikçe, bu yöntemler Provider arabirimi kullanılarak ayrı sınıflara taşınabilir.

class SpellCheckerProvider implements Provider<SpellChecker>{
   @Override
   public SpellChecker get() {
      String dbUrl = "jdbc:mysql://localhost:5326/emp";
      String user = "user";
      int timeout = 100;
      SpellChecker SpellChecker = new SpellCheckerImpl(dbUrl, user, timeout);
      return SpellChecker;
   } 
}

Sonraki adım, sağlayıcıyı yazmak için eşlemektir.

bind(SpellChecker.class).toProvider(SpellCheckerProvider.class);

Aşağıdaki tam örneğe bakın.

Tam Örnek

GuiceTester adlı bir java sınıfı oluşturun.

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.Provider;

public class GuiceTester {
   public static void main(String[] args) {
      Injector injector = Guice.createInjector(new TextEditorModule());
      TextEditor editor = injector.getInstance(TextEditor.class);
      editor.makeSpellCheck();
   } 
}

class TextEditor {
   private SpellChecker spellChecker;
   @Inject
   public TextEditor( SpellChecker spellChecker) {
      this.spellChecker = spellChecker;
   }

   public void makeSpellCheck(){
      spellChecker.checkSpelling();
   } 
}

//Binding Module
class TextEditorModule extends AbstractModule {

   @Override
   protected void configure() {
      bind(SpellChecker.class)
         .toProvider(SpellCheckerProvider.class);
   } 
}

//spell checker interface
interface SpellChecker {
   public void checkSpelling();
}

//spell checker implementation
class SpellCheckerImpl implements SpellChecker {

   private String dbUrl;
   private String user;
   private Integer timeout;

   @Inject
   public SpellCheckerImpl(String dbUrl, 
      String user, 
      Integer timeout){
      this.dbUrl = dbUrl;
      this.user = user;
      this.timeout = timeout;
   } 

   @Override
   public void checkSpelling() { 
      System.out.println("Inside checkSpelling." );
      System.out.println(dbUrl);
      System.out.println(user);
      System.out.println(timeout);
   }
}

class SpellCheckerProvider implements Provider<SpellChecker>{

   @Override
   public SpellChecker get() {
      String dbUrl = "jdbc:mysql://localhost:5326/emp";
      String user = "user";
      int timeout = 100;

      SpellChecker SpellChecker = new SpellCheckerImpl(dbUrl, user, timeout);
      return SpellChecker;
   }
}

Çıktı

Dosyayı derleyin ve çalıştırın, aşağıdaki çıktıyı göreceksiniz.

Inside checkSpelling.
jdbc:mysql://localhost:5326/emp
user
100

Guice, toConstructor () yöntemini kullanarak bir nesnenin belirli yapıcısıyla bağlamalar oluşturmanın bir yolunu sağlar.

@Override
protected void configure() {
   try {
      bind(SpellChecker.class)
         .toConstructor(SpellCheckerImpl.class.getConstructor(String.class));
      } catch (NoSuchMethodException | SecurityException e) {
      System.out.println("Required constructor missing");
   } 
}

Aşağıdaki tam örneğe bakın.

Tam Örnek

GuiceTester adlı bir java sınıfı oluşturun.

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.name.Named;
import com.google.inject.name.Names;

public class GuiceTester {
   public static void main(String[] args) {
      Injector injector = Guice.createInjector(new TextEditorModule());
      TextEditor editor = injector.getInstance(TextEditor.class);
      editor.makeSpellCheck();
   } 
}

class TextEditor {
   private SpellChecker spellChecker;
   @Inject
   public TextEditor( SpellChecker spellChecker) {
      this.spellChecker = spellChecker;
   }

   public void makeSpellCheck(){
      spellChecker.checkSpelling();
   } 
}

//Binding Module
class TextEditorModule extends AbstractModule {

   @Override
   protected void configure() {
      try {
         bind(SpellChecker.class)
            .toConstructor(SpellCheckerImpl.class.getConstructor(String.class));
      } catch (NoSuchMethodException | SecurityException e) {
         System.out.println("Required constructor missing");
      } 
      bind(String.class)
         .annotatedWith(Names.named("JDBC"))
         .toInstance("jdbc:mysql://localhost:5326/emp");
   } 
}

//spell checker interface
interface SpellChecker {
   public void checkSpelling();
}

//spell checker implementation
class SpellCheckerImpl implements SpellChecker {

   private String dbUrl;

   public SpellCheckerImpl(){}

   public SpellCheckerImpl(@Named("JDBC") String dbUrl){
      this.dbUrl = dbUrl;
   } 

   @Override
   public void checkSpelling() { 
      System.out.println("Inside checkSpelling." );
      System.out.println(dbUrl); 
   }
}

Çıktı

Dosyayı derleyin ve çalıştırın, aşağıdaki çıktıyı göreceksiniz.

Inside checkSpelling.
jdbc:mysql://localhost:5326/emp

Guice, java.util.logging.Logger sınıfı için dahili bağlama sağlar . Logger'ın adı, Logger'ın enjekte edildiği sınıfın adına otomatik olarak ayarlanır. Aşağıdaki örneğe bakın.

Misal

GuiceTester adlı bir java sınıfı oluşturun.

GuiceTester.java

import java.util.logging.Logger;

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());
      TextEditor editor = injector.getInstance(TextEditor.class);
      editor.makeSpellCheck();
   } 
}

class TextEditor {
   private Logger logger;

   @Inject
   public TextEditor( Logger logger) {
      this.logger = logger;
   }

   public void makeSpellCheck(){
      logger.info("In TextEditor.makeSpellCheck() method");
   } 
}

//Binding Module
class TextEditorModule extends AbstractModule {

   @Override
   protected void configure() {
   } 
}

Çıktı

Dosyayı derleyin ve çalıştırın, aşağıdaki çıktıyı göreceksiniz.

Dec 20, 2017 12:51:05 PM TextEditor makeSpellCheck
INFO: In TextEditor.makeSpellCheck() method

Bağlamalar Bağlama Modülünde tanımlandığı için, Guice bağımlılıkları enjekte etmesi gerektiğinde bunları kullanır. Bağlamaların mevcut olmaması durumunda, tam zamanında bağlamalar oluşturmaya çalışabilir. Bağlama modülünde bulunan bağlar, açık bağlamalar olarak adlandırılır ve daha yüksek önceliğe sahipken, tam zamanında bağlamalara örtük bağlar adı verilir. Her iki bağlama türü de mevcutsa, eşleme için açık bağlamalar dikkate alınır.

Aşağıda, tam zamanında bağlamanın üç türüne ilişkin örnekler verilmiştir.

Bağlama Tipi Açıklama
Enjekte Edilebilir Yapıcılar Özel olmayan, bağımsız değişken içermeyen oluşturucular, tam zamanında bağlamalar için uygundur. Başka bir yol da bir kurucuya @Inject ek açıklaması ile açıklama eklemektir.
@ImplementatedBy annotation @ImplementatedBy annotation, kılavuza uygulama sınıfı hakkında bilgi verir. Böyle bir durumda Bağlama Modülünde herhangi bir bağlayıcılık gerekmez.
@ProvidedBy annotation @ProvidedBy annotation, kılavuza uygulama sınıfı sağlayıcısı hakkında bilgi verir. Böyle bir durumda Bağlama Modülünde herhangi bir bağlayıcılık gerekmez.

Özel olmayan, bağımsız değişken içermeyen oluşturucular, tam zamanında bağlamalar için uygundur. Başka bir yol da bir kurucuya @Inject ek açıklaması ile açıklama eklemektir. Örneğe bakın:

Misal

GuiceTester adlı bir java sınıfı oluşturun.

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.name.Named;
import com.google.inject.name.Names;

public class GuiceTester {
   public static void main(String[] args) {
      Injector injector = Guice.createInjector(new TextEditorModule());
      TextEditor editor = injector.getInstance(TextEditor.class);
      editor.makeSpellCheck();
   } 
}

class TextEditor {
   private SpellChecker spellChecker;

   @Inject
   public TextEditor( SpellChecker spellChecker) {
      this.spellChecker = spellChecker;
   }

   public void makeSpellCheck(){
      spellChecker.checkSpelling();
   } 
}

//Binding Module
class TextEditorModule extends AbstractModule {

   @Override
   protected void configure() { 
      bind(SpellChecker.class).to(SpellCheckerImpl.class);
      bind(String.class)
         .annotatedWith(Names.named("JDBC"))
         .toInstance("jdbc:mysql://localhost:5326/emp");
   } 
}

//spell checker interface
interface SpellChecker {
   public void checkSpelling();
}

//spell checker implementation
class SpellCheckerImpl implements SpellChecker {

   @Inject @Named("JDBC")
   private String dbUrl;

   public SpellCheckerImpl(){}

   @Override
   public void checkSpelling() { 
      System.out.println("Inside checkSpelling." );
      System.out.println(dbUrl); 
   }
}

Çıktı

Dosyayı derleyin ve çalıştırın, aşağıdaki çıktıyı göreceksiniz.

Inside checkSpelling.
jdbc:mysql://localhost:5326/emp

@ImplementatedBy annotation, kılavuza uygulama sınıfı hakkında bilgi verir. Böyle bir durumda Bağlama Modülünde herhangi bir bağlayıcılık gerekmez. Örneğe bakın:

Misal

GuiceTester adlı bir java sınıfı oluşturun.

GuiceTester.java

import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.ImplementedBy;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.name.Named;
import com.google.inject.name.Names;

public class GuiceTester {
   public static void main(String[] args) {
      Injector injector = Guice.createInjector(new TextEditorModule());
      TextEditor editor = injector.getInstance(TextEditor.class);
      editor.makeSpellCheck();
   } 
}

class TextEditor {
   private SpellChecker spellChecker;

   @Inject
   public TextEditor( SpellChecker spellChecker) {
      this.spellChecker = spellChecker;
   }

   public void makeSpellCheck(){
      spellChecker.checkSpelling();
   } 
}

//Binding Module
class TextEditorModule extends AbstractModule {

   @Override
   protected void configure() { 
      bind(String.class)
         .annotatedWith(Names.named("JDBC"))
         .toInstance("jdbc:mysql://localhost:5326/emp");
   } 
}

@ImplementedBy(SpellCheckerImpl.class)
interface SpellChecker {
   public void checkSpelling();
}

//spell checker implementation
class SpellCheckerImpl implements SpellChecker {

   @Inject @Named("JDBC")
   private String dbUrl;

   public SpellCheckerImpl(){}

   @Override
   public void checkSpelling() { 
      System.out.println("Inside checkSpelling." );
      System.out.println(dbUrl); 
   }
}

Çıktı

Dosyayı derleyin ve çalıştırın, aşağıdaki çıktıyı göreceksiniz.

Inside checkSpelling.
jdbc:mysql://localhost:5326/emp

@ProvidedBy annotation, kılavuza uygulama sınıfı sağlayıcısı hakkında bilgi verir. Böyle bir durumda Bağlama Modülünde herhangi bir bağlayıcılık gerekmez. Örneğe bakın:

Misal

GuiceTester adlı bir java sınıfı oluşturun.

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.ProvidedBy;
import com.google.inject.Provider;

public class GuiceTester {
   public static void main(String[] args) {
      Injector injector = Guice.createInjector(new TextEditorModule());
      TextEditor editor = injector.getInstance(TextEditor.class);
      editor.makeSpellCheck();
   } 
}

class TextEditor {
   private SpellChecker spellChecker;
   @Inject
   public TextEditor( SpellChecker spellChecker) {
      this.spellChecker = spellChecker;
   }

   public void makeSpellCheck(){
      spellChecker.checkSpelling();
   } 
}

//Binding Module
class TextEditorModule extends AbstractModule {

   @Override
   protected void configure() {     
   } 
}

@ProvidedBy(SpellCheckerProvider.class)
interface SpellChecker {
   public void checkSpelling();
}

//spell checker implementation
class SpellCheckerImpl implements SpellChecker {

   private String dbUrl;
   private String user;
   private Integer timeout;

   @Inject
   public SpellCheckerImpl(String dbUrl, 
      String user, 
      Integer timeout){
      this.dbUrl = dbUrl;
      this.user = user;
      this.timeout = timeout;
   } 

   @Override
   public void checkSpelling() { 
      System.out.println("Inside checkSpelling." );
      System.out.println(dbUrl);
      System.out.println(user);
      System.out.println(timeout);
   }
}

class SpellCheckerProvider implements Provider<SpellChecker>{

   @Override
   public SpellChecker get() {
      String dbUrl = "jdbc:mysql://localhost:5326/emp";
      String user = "user";
      int timeout = 100;

      SpellChecker SpellChecker = new SpellCheckerImpl(dbUrl, user, timeout);
      return SpellChecker;
   }
}

Çıktı

Dosyayı derleyin ve çalıştırın, aşağıdaki çıktıyı göreceksiniz.

Inside checkSpelling.
jdbc:mysql://localhost:5326/emp
user
100

Enjeksiyon, bir nesneye bağımlılık enjekte etme sürecidir. Yapıcı enjeksiyonu oldukça yaygındır. Bu süreçte, bağımlılık yapıcıya argüman olarak enjekte edilir. Aşağıdaki örneğe bakın.

GuiceTester adlı bir java sınıfı oluşturun.

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());
      TextEditor editor = injector.getInstance(TextEditor.class);
      editor.makeSpellCheck(); 
   } 
}

class TextEditor {
   private SpellChecker spellChecker;

   @Inject
   public TextEditor(SpellChecker spellChecker) {
      this.spellChecker = spellChecker;
   }

   public void makeSpellCheck(){
      spellChecker.checkSpelling();
   }
}

//Binding Module
class TextEditorModule extends AbstractModule {

   @Override
   protected void configure() {
      bind(SpellChecker.class).to(SpellCheckerImpl.class);
   } 
}

//spell checker interface
interface SpellChecker {
   public void checkSpelling();
}


//spell checker implementation
class SpellCheckerImpl implements SpellChecker {

   @Override
   public void checkSpelling() {
      System.out.println("Inside checkSpelling." );
   } 
}

Çıktı

Dosyayı derleyin ve çalıştırın, aşağıdaki çıktıyı göreceksiniz.

Inside checkSpelling.

Enjeksiyon, bir nesneye bağımlılık enjekte etme sürecidir. Yöntem enjeksiyonu, değer nesnesini nesneye bağımlılık olarak ayarlamak için kullanılır. Aşağıdaki örneğe bakın.

Misal

GuiceTester adlı bir java sınıfı oluşturun.

import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.ImplementedBy;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.name.Named;
import com.google.inject.name.Names;

public class GuiceTester {
   public static void main(String[] args) {
      Injector injector = Guice.createInjector(new TextEditorModule());
      TextEditor editor = injector.getInstance(TextEditor.class);
      editor.makeSpellCheck();
   } 
}

class TextEditor {
   private SpellChecker spellChecker;

   @Inject
   public TextEditor( SpellChecker spellChecker) {
      this.spellChecker = spellChecker;
   }

   public void makeSpellCheck(){
      spellChecker.checkSpelling();
   } 
}

//Binding Module
class TextEditorModule extends AbstractModule {

   @Override
   protected void configure() { 
      bind(String.class)
         .annotatedWith(Names.named("JDBC"))
         .toInstance("jdbc:mysql://localhost:5326/emp");
   } 
}

@ImplementedBy(SpellCheckerImpl.class)
interface SpellChecker {
   public void checkSpelling();
}

//spell checker implementation
class SpellCheckerImpl implements SpellChecker {
 
   private String dbUrl;

   public SpellCheckerImpl(){}
   
   @Inject 
   public void setDbUrl(@Named("JDBC") String dbUrl){
      this.dbUrl = dbUrl;
   }

   @Override
   public void checkSpelling() { 
      System.out.println("Inside checkSpelling." );
      System.out.println(dbUrl); 
   }
}

Çıktı

Dosyayı derleyin ve çalıştırın, aşağıdaki çıktıyı göreceksiniz.

Inside checkSpelling.
jdbc:mysql://localhost:5326/emp

Enjeksiyon, bir nesneye bağımlılık enjekte etme sürecidir. Alan enjeksiyonu, değer nesnesini bir nesnenin alanına bağımlılık olarak ayarlamak için kullanılır. Aşağıdaki örneğe bakın.

Misal

GuiceTester adlı bir java sınıfı oluşturun.

GuiceTester.java

import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.ImplementedBy;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.name.Named;
import com.google.inject.name.Names;

public class GuiceTester {
   public static void main(String[] args) {
      Injector injector = Guice.createInjector(new TextEditorModule());
      TextEditor editor = injector.getInstance(TextEditor.class);
      editor.makeSpellCheck();
   } 
}

class TextEditor {
   private SpellChecker spellChecker;

   @Inject
   public TextEditor( SpellChecker spellChecker) {
      this.spellChecker = spellChecker;
   }

   public void makeSpellCheck(){
      spellChecker.checkSpelling();
   } 
}

//Binding Module
class TextEditorModule extends AbstractModule {

   @Override
   protected void configure() { 
      bind(String.class)
         .annotatedWith(Names.named("JDBC"))
         .toInstance("jdbc:mysql://localhost:5326/emp");
   } 
}

@ImplementedBy(SpellCheckerImpl.class)
interface SpellChecker {
   public void checkSpelling();
}

//spell checker implementation
class SpellCheckerImpl implements SpellChecker {

   @Inject @Named("JDBC")
   private String dbUrl;

   public SpellCheckerImpl(){}

   @Override
   public void checkSpelling() { 
      System.out.println("Inside checkSpelling." );
      System.out.println(dbUrl); 
   }
}

Çıktı

Dosyayı derleyin ve çalıştırın, aşağıdaki çıktıyı göreceksiniz.

Inside checkSpelling.
jdbc:mysql://localhost:5326/emp

Enjeksiyon, bir nesneye bağımlılık enjekte etme sürecidir. İsteğe bağlı enjeksiyon, varsa bağımlılığı enjekte etmek anlamına gelir. Yöntem ve Alan enjeksiyonları isteğe bağlı olarak bağımlı olabilir ve bağımlılık yoksa bazı varsayılan değerlere sahip olmalıdır. Aşağıdaki örneğe bakın.

Misal

GuiceTester adlı bir java sınıfı oluşturun.

GuiceTester.java

import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.ImplementedBy;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.name.Named;

public class GuiceTester {
   public static void main(String[] args) {
      Injector injector = Guice.createInjector(new TextEditorModule());
      TextEditor editor = injector.getInstance(TextEditor.class);
      editor.makeSpellCheck();
   } 
}

class TextEditor {
   private SpellChecker spellChecker;

   @Inject
   public TextEditor( SpellChecker spellChecker) {
      this.spellChecker = spellChecker;
   }

   public void makeSpellCheck(){
      spellChecker.checkSpelling();
   } 
}

//Binding Module
class TextEditorModule extends AbstractModule {

   @Override
   protected void configure() {} 
}

@ImplementedBy(SpellCheckerImpl.class)
interface SpellChecker {
   public void checkSpelling();
}

//spell checker implementation
class SpellCheckerImpl implements SpellChecker {

   private String dbUrl = "jdbc:mysql://localhost:5326/emp";

   public SpellCheckerImpl(){}
   
   @Inject(optional=true)
   public void setDbUrl(@Named("JDBC") String dbUrl){
      this.dbUrl = dbUrl;
   }

   @Override
   public void checkSpelling() { 
      System.out.println("Inside checkSpelling." );
      System.out.println(dbUrl); 
   }
}

Çıktı

Dosyayı derleyin ve çalıştırın, aşağıdaki çıktıyı göreceksiniz.

Inside checkSpelling.
jdbc:mysql://localhost:5326/emp

Enjeksiyon, bir nesneye bağımlılık enjekte etme sürecidir. Enjektör.injectMembers () yöntemi kullanılarak çıkan nesneyi kullanarak ilk kullanıma hazırlamak için yöntem ve alan enjeksiyonları kullanılabilir . Aşağıdaki örneğe bakın.

Misal

GuiceTester adlı bir java sınıfı oluşturun.

GuiceTester.java

import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.ImplementedBy;
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);     
      editor.makeSpellCheck();
   } 
}

class TextEditor {
   private SpellChecker spellChecker;

   @Inject
   public void setSpellChecker(SpellChecker spellChecker){
   this.spellChecker = spellChecker;
   }
   public TextEditor() { }

   public void makeSpellCheck(){
      spellChecker.checkSpelling();
   } 
}

//Binding Module
class TextEditorModule extends AbstractModule {

   @Override
   protected void configure() {      
   } 
}

@ImplementedBy(SpellCheckerImpl.class)
interface SpellChecker {
   public void checkSpelling();
}

//spell checker implementation
class SpellCheckerImpl implements SpellChecker {

   public SpellCheckerImpl(){}
   
   @Override
   public void checkSpelling() { 
      System.out.println("Inside checkSpelling." );
   }
}

Dosyayı derleyin ve çalıştırın, aşağıdaki çıktıyı göreceksiniz.

Inside checkSpelling.

Guice, varsayılan davranışı olarak bir değer sağladığında her seferinde yeni bir örnek döndürür. Kapsamlar aracılığıyla yapılandırılabilir. Guice'in desteklediği kapsamlar şunlardır:

  • @Singleton- Uygulamanın kullanım ömrü boyunca tek örnek. @Singleton nesnesinin iş parçacığı güvenli olması gerekir.

  • @SessionScoped- Web uygulamasının belirli bir oturumu için tek örnek. @SessionScoped nesnesinin iş parçacıklı olması gerekir.

  • @RequestScoped- Web uygulamasının belirli bir isteği için tek örnek. @RequestScoped nesnesinin iş parçacıklı olması gerekmez.

Kapsam uygulama yolu.

Kapsam uygulama yolları aşağıdadır.

Sınıf düzeyinde

@Singleton
class SpellCheckerImpl implements SpellChecker {

   public SpellCheckerImpl(){}
   
   @Override
   public void checkSpelling() { 
      System.out.println("Inside checkSpelling." );
   }
}

Yapılandırma düzeyinde

bind(SpellChecker.class).to(SpellCheckerImpl.class).in(Singleton.class);

Yöntem düzeyinde

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

Misal

Kapsamı sınıf düzeyinde çalışırken görelim.

@Singleton Ek Açıklama ile Sonuç

GuiceTester adlı bir java sınıfı oluşturun.

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

Dosyayı derleyin ve çalıştırın, aşağıdaki çıktıyı görebilirsiniz.

0.3055839187063575
0.3055839187063575

@Singleton Ek Açıklama Olmadan Sonuç

GuiceTester adlı bir java sınıfı oluşturun.

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

Dosyayı derleyin ve çalıştırın, aşağıdaki çıktıyı görebilirsiniz.

0.556007079571739
0.22095011760351602

Google Guice - AOP

AOP, Bakış açısına yönelik programlama, program mantığını sözde endişeler adı verilen farklı bölümlere ayırmayı gerektirir. Bir uygulamanın birden çok noktasını kapsayan işlevler, kesişen konular olarak adlandırılır ve bu kesişen sorunlar, kavramsal olarak uygulamanın iş mantığından ayrıdır. Günlüğe kaydetme, denetim, bildirimsel işlemler, güvenlik, önbelleğe alma vb. Gibi çeşitli yaygın iyi örnekler vardır.

OOP'de modülerliğin ana birimi sınıftır, oysa AOP'de modülerlik birimi görünümdür. Bağımlılık Enjeksiyonu, uygulama nesnelerinizi birbirinden ayırmanıza yardımcı olur ve AOP, kesişen endişeleri etkiledikleri nesnelerden ayırmanıza yardımcı olur. AOP, Perl, .NET, Java ve diğerleri gibi programlama dillerindeki tetikleyiciler gibidir. Guice, bir uygulamayı durdurmak için önleyiciler sağlar. Örneğin, bir yöntem yürütüldüğünde, yöntemin yürütülmesinden önce veya sonra ekstra işlevsellik ekleyebilirsiniz.

Önemli Sınıflar

  • Matcher- Eşleştirici, bir değeri kabul etmek veya reddetmek için kullanılan bir arayüzdür. Guice AOP'de iki eşleştiriciye ihtiyacımız var: biri hangi sınıfların katılacağını tanımlamak için, diğeri bu sınıfların yöntemleri için.

  • MethodInterceptor- MethodInterceptors, eşleşen bir yöntem çağrıldığında yürütülür. Çağrıyı inceleyebilirler: yöntem, argümanları ve alıcı örneği. Çapraz kesme mantığını uygulayabilir ve ardından temeldeki yönteme delege edebiliriz. Son olarak, iade değerini veya istisnayı inceleyip geri dönebiliriz.

Misal

GuiceTester adlı bir java sınıfı oluşturun.

GuiceTester.java

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.matcher.Matchers;

public class GuiceTester {
   public static void main(String[] args) {
      Injector injector = Guice.createInjector(new TextEditorModule());
      TextEditor editor = injector.getInstance(TextEditor.class);
      editor.makeSpellCheck(); 
   } 
}

class TextEditor {
   private SpellChecker spellChecker;

   @Inject
   public TextEditor(SpellChecker spellChecker) {
      this.spellChecker = spellChecker;
   }

   public void makeSpellCheck(){
      spellChecker.checkSpelling();
   }
}

//Binding Module
class TextEditorModule extends AbstractModule {

   @Override
   protected void configure() {
      bind(SpellChecker.class).to(SpellCheckerImpl.class);
      bindInterceptor(Matchers.any(), 
         Matchers.annotatedWith(CallTracker.class), 
         new CallTrackerService());
   } 
}

//spell checker interface
interface SpellChecker {
   public void checkSpelling();
}

//spell checker implementation
class SpellCheckerImpl implements SpellChecker {

   @Override @CallTracker
   public void checkSpelling() {
      System.out.println("Inside checkSpelling." );
   } 
}

@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD)
@interface CallTracker {}

class CallTrackerService implements MethodInterceptor  {

   @Override
   public Object invoke(MethodInvocation invocation) throws Throwable {
      System.out.println("Before " + invocation.getMethod().getName());
      Object result = invocation.proceed();
      System.out.println("After " + invocation.getMethod().getName());
      return result;
   }
}

Dosyayı derleyin ve çalıştırın, aşağıdaki çıktıyı görebilirsiniz.

Before checkSpelling
Inside checkSpelling.
After checkSpelling