АОП, Аспектно-ориентированное программирование влечет за собой разбиение логики программы на отдельные части, называемые так называемыми проблемами. Функции, охватывающие несколько точек приложения, называются сквозными задачами, и эти сквозные задачи концептуально отделены от бизнес-логики приложения. Существуют различные общие хорошие примеры таких аспектов, как ведение журнала, аудит, декларативные транзакции, безопасность, кэширование и т. Д.
Ключевой единицей модульности в ООП является класс, тогда как в АОП единицей модульности является аспект. Внедрение зависимостей помогает отделить объекты приложения друг от друга, а 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; } }
Скомпилируйте и запустите файл, вы можете увидеть следующий вывод.