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