Google Guice - AOP
АОП, аспектно-ориентированное программирование влечет за собой разбиение логики программы на отдельные части, называемые так называемыми задачами. Функции, охватывающие несколько точек приложения, называются сквозными задачами, и эти сквозные задачи концептуально отделены от бизнес-логики приложения. Существуют различные общие хорошие примеры таких аспектов, как ведение журнала, аудит, декларативные транзакции, безопасность, кеширование и т. Д.
Ключевой единицей модульности в ООП является класс, тогда как в АОП единицей модульности является аспект. Внедрение зависимостей помогает отделить объекты приложения друг от друга, а АОП помогает отделить сквозные проблемы от объектов, на которые они влияют. АОП похож на триггеры в таких языках программирования, как Perl, .NET, Java и другие. Guice предоставляет перехватчики для перехвата приложения. Например, при выполнении метода вы можете добавить дополнительные функции до или после выполнения метода.
Важные классы
Matcher- Matcher - это интерфейс для принятия или отклонения значения. В Guice AOP нам нужны два сопоставителя: один для определения участвующих классов, а другой - для методов этих классов.
MethodInterceptor- MethodInterceptors выполняются при вызове соответствующего метода. Они могут проверить вызов: метод, его аргументы и принимающий экземпляр. Мы можем выполнить сквозную логику, а затем делегировать базовый метод. Наконец, мы можем проверить возвращаемое значение или исключение и вернуться.
пример
Создайте Java-класс с именем GuiceTester.
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;
}
}
Вывод
Скомпилируйте и запустите файл, вы можете увидеть следующий результат.
Before checkSpelling
Inside checkSpelling.
After checkSpelling