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 konular, 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 ve 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. Kesişen mantık uygulayabilir ve ardından temel alınan 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;
}
}
Çıktı
Dosyayı derleyin ve çalıştırın, aşağıdaki çıktıyı görebilirsiniz.
Before checkSpelling
Inside checkSpelling.
After checkSpelling