Что такое AOP
Можно сказать, что AOP (ориентированное на аспект программирование, ориентированное на аспект)-это дополнение и улучшение ООП (объектно-ориентированное программирование). OOP вводит такие понятия, как инкапсуляция, наследование и полиморфизм, чтобы установить иерархию объекта для имитации коллекции общественного поведения. Когда нам нужно ввести общественное поведение в рассеянные объекты, ООП кажется бессильным. То есть ООП позволяет вам определять отношения сверху донизу, но не подходит для определения отношений слева направо. Например, функция регистрации. Код журнала часто рассеяется горизонтально по всем уровням объектов без какого -либо отношения к основной функциональности объекта, которому он рассеян. То же самое относится и к другим типам кода, таким как безопасность, обработка исключений и прозрачность. Этот вид нерелевантного кода, разбросанный повсюду, называется кодом перекрестного обрезания. В дизайне ООП это вызывает много дублирования кода, что не способствует повторному использованию каждого модуля.
Введение
Паттерн дизайна Java, который я написал некоторое время назад - Proxy Pattern. Недавно, когда я смотрел на Spring AOP, я чувствовал, что в прокси -паттерне должны быть тесные связи, поэтому я решил понять принцип реализации Spring AOP.
Говоря о AOP, мы должны поговорить о ООП. Концепции инкапсуляции, наследования и полиморфизма вводятся в ООП для установления объектной иерархии для имитации коллекции общественного поведения. Однако, если нам нужно ввести общие детали для некоторых объектов, ООП введет много дублированного кода. Например: функция регистрации.
Технология AOP использует методику, называемую «перекрестным», для рассечения внутренней части инкапсулированного объекта и инкапсуляции общего поведения, которые влияют на множественные классы в повторный модуль, который может снизить дублирование системы кода, уменьшить связь между модулями и облегчить будущую работу и обслуживание. AOP делит программную систему на две части: основная проблема и перекрестное внимание. Основным процессом обработки бизнеса является основной целью, и часть, которая имеет к нему мало общего, является поперечное внимание. Одна из характеристик перекрестных проблем состоит в том, что они часто возникают в нескольких основных проблемах и в основном похожи везде. Например, аутентификация разрешения, ведение журнала и обработка транзакций.
Принцип реализации
Когда я изучал режим прокси, я узнал, что прокси -режим разделен на динамический прокси и статический прокси. Теперь мы сначала внедрим нашу собственную структуру AOP на основе модели прокси, а затем изучим принципы реализации Spring AOP.
Во -первых, он реализован со статическим прокси. Ключом к статическому прокси -серве является реализация общего интерфейса между объектом прокси и целевым объектом, а объект прокси содержит ссылку на целевой объект.
Код общественного интерфейса:
Публичный интерфейс iHello {/*** Бизнес -метод*@param str*/void sayhello (string str);} код целевого класса: открытый класс Hello реализует iHello {@OverridePublic void sayHello (String str) {System.out.println ("hello"+str);}}}}} Для кода класса прокси мы добавляем к нему функцию журнала и выполняем конкретные методы до и после запуска метода. Разве это не особенно похоже на AOP?
Общедоступный класс Proxyhello реализует iHello {private iHello Hello; public proxyhello (ihello hello) {super (); this.hello = hello;}@overridepublic void sayshello (string str) {logger.start (); // Добавить конкретный метод hello.sayhello (str); logger.end ();}} Код класса журнала:
Общедоступный класс Logger {public static void start () {System.out.println (new Date ()+ "Say Hello Start ...");} public static void end () {System.out.println (new Date ()+ "Скажи привет end");}}}}}}}}}}}}}}} Тестовый код:
Общедоступный тест класса {public static void main (string [] args) {iHello hello = new Proxyhello (new Hello ()); // Если нам нужна функция журнала, используйте класс Proxy // iHello hello = new Hello (); // Если нам не нужна функция регистрации, используйте целевой класс hello.sayhello ("завтра"); }}Таким образом, мы реализуем самый простой AOP, но будет проблема: если у нас будет много классов, таких как Hello, то должны ли мы написать много классов, таких как Helloproxy? На самом деле, это также очень хлопотная вещь. После JDK1.3 JDK предоставляет нам API java.lang.reflect.invocationHandler Class. Этот класс позволяет нам динамически делать что -то для некоторых методов, когда JVM называет методы определенного класса. Давайте внедрим реализацию динамического прокси.
Динамическая реализация прокси в основном реализует vocationHandler и вводит целевой объект в объект прокси, используя механизм отражения для выполнения метода целевого объекта.
Реализация интерфейса такая же, как и статический прокси, код класса прокси:
Общедоступный класс DynAproxyHello реализует vocationHandler {частный объект Target; // Целевой объект/*** создание целевого объекта через отражение* @param object* @return*/public объект связывания (объект объекта) {this.target = object; return proxy.newproxyinstance (this.target.getClass (). this);}@overdepublic object invoke (proxy объекта, метод метода, объект [] args) бросает throwable {object result = null; logger.start (); // Добавить дополнительные методы // методы для запуска целевых объектов с помощью механизма отражения. Тестовый код класса:
открытый класс Dynatest {public static void main (string [] args) {iHello hello = (iHello) new DynaproxyHello (). Bind (new Hello ()); // Если нам нужна функция журнала, используйте класс Proxy // iHello hello = new Hello (); // Если нам не нужна функция регистрации, используйте целевой класс Hello. После прочтения вышеупомянутого кода может возникнуть проблема по сравнению с Spring AOP. Класс журналов может быть напечатан только до и после метода, но AOP должен быть в состоянии выполнять при выполнении условий. Можно ли отделить весь объект DynapoxyHello и объект работы журнала (logger)?
Глядя на следующую реализацию кода, он отделяет объект DynapoxyHello и объект работы журнала (Logger):
Нам нужно добавить код работы журнала (или другой код работы) до или после метода прокси -объекта. Затем мы можем абстрагировать интерфейс, который имеет только два метода: один - это метод, выполненный до того, как объект прокси захочет выполнить метод. Мы назвали его запуск, а второй метод - это метод, выполненный после того, как объект прокси выполняет метод, и мы назвали его END.
Интерфейс регистратора:
Публичный интерфейс ilogger {void start (метод метода); void end (метод метода);} Реализация интерфейса интерфейса регистрации:
Общедоступный класс Dlogger реализует ilogger {@OverridePublic void start (метод метода) {System.out.println (new Date () + Method.getName () + "SAIL HELLENT ...");}@переопределить void end (метод) {System.out.println (new Date () + Метод. Динамический класс прокси:
открытый класс DynAproxyHello реализует vocationHandler {// вызов объекта Proxy Proxy; // целевой объект объекта this.target.getClass (). getInterfaces (), this);}@overridePublic Object Invoke (Proxy Object, метод метода, объект [] args) бросает Throwable {Object result = null; // Отражение получает метод экземпляра оператора. Class [] {method.class}); // Отражение выполняет метод начала start.invoke (this.proxy, новый объект [] {this.proxy.getclass ()}); // выполняет исходный метод для обработки метода объекта. Class [] {method.class}); // Refluection выполняет метод End End.invoke (this.proxy, new Object [] {method}); return result;}} Тестовый код:
открытый класс Dynatest {public static void main (string [] args) {iHello hello = (iHello) new DynaproxyHello (). Bind (new Hello (), new dlogger ()); // Если нам нужна функция журнала, используйте класс Proxy // ihello hello = new Hello (); hello.sayhello ("завтра");}} Через приведенный выше пример мы можем обнаружить, что благодаря технологии динамического прокси и передачи, функция AOP была в основном реализована. Если нам нужно только распечатать журнал до выполнения метода, мы не сможем реализовать метод End (), чтобы мы могли управлять временем печати. Если мы хотим, чтобы указанный метод печатал журнал, нам нужно только добавить суждение об имени метода в метод inoke (). Имя метода может быть записано в файле XML, чтобы мы могли отделить его с помощью файла конфигурации, чтобы мы реализовали простую структуру Spring AOP.
Приведенный выше контент является принципом реализации Spring AOP, введенным вам редактором. Я надеюсь, что это будет полезно для вас!