Учебники

Google Guice — AOP

АОП, Аспектно-ориентированное программирование влечет за собой разбиение логики программы на отдельные части, называемые так называемыми проблемами. Функции, охватывающие несколько точек приложения, называются сквозными задачами, и эти сквозные задачи концептуально отделены от бизнес-логики приложения. Существуют различные общие хорошие примеры таких аспектов, как ведение журнала, аудит, декларативные транзакции, безопасность, кэширование и т. Д.

Ключевой единицей модульности в ООП является класс, тогда как в АОП единицей модульности является аспект. Внедрение зависимостей помогает отделить объекты приложения друг от друга, а AOP помогает отделить сквозные задачи от объектов, на которые они влияют. AOP подобен триггерам в таких языках программирования, как Perl, .NET, Java и других. Guice предоставляет перехватчики для перехвата приложения. Например, когда метод выполняется, вы можете добавить дополнительные функции до или после выполнения метода.

Важные классы

  • Matcher — Matcher — это интерфейс для принятия или отклонения значения. В Guice AOP нам нужны два сопоставителя: один для определения участвующих классов, а другой для методов этих классов.

  • MethodInterceptor — MethodInterceptors выполняются, когда вызывается соответствующий метод. Они могут проверить вызов: метод, его аргументы и получающий экземпляр. Мы можем выполнить сквозную логику, а затем делегировать базовый метод. Наконец, мы можем проверить возвращаемое значение или исключение и вернуть.

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

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