Обзор
Модуль Spirng-AOP является модулем ядра в пружинной структуре. Хотя пружинный контейнер МОК не полагается на AOP, AOP предоставляет мощное и гибкое решение для реализации МОК.
В Spring Framework AOP в основном используется для двух целей:
С функциональной точки зрения, AOP может рассматриваться как дополнение к методу программирования ООП, обеспечивая другой способ кода или системной организации. Основная концепция в ООП - класс, а в AOP - это аспект.
Модуль Spirng-AOP является модулем ядра в пружинной структуре. Хотя пружинный контейнер МОК не полагается на AOP, AOP предоставляет мощное и гибкое решение для реализации МОК.
В Spring Framework AOP в основном используется для двух целей:
Spring AOP реализуется в чистой Java и не требует специальной обработки компиляции и не требует управления иерархией загрузчика класса, поэтому его можно использовать для сервственного контейнера и других серверов приложений.
В настоящее время Spring AOP поддерживает только переключение или перехват на уровне метода, а перехват атрибутов сейчас не поддерживается. Если вы хотите перехватить атрибуты, вы можете рассмотреть возможность использования языка аспекта.
Spring AOP используется иначе, чем большинство других рамок AOP. Его основная цель - не предоставить большой и всеобъемлющий набор реализаций AOP, а для интеграции различных реализаций AOP и сотрудничать с Spring IOC, чтобы помочь решить некоторые общие проблемы.
Следует отметить, что некоторые мелкозернистые советы (такие как доменная модель), Spring AOP часто не оказывает хорошей поддержки, и этот сценарий все еще рассматривает AspectJ. Несмотря на это, в общем опыте мощный механизм Spring AOP все еще может решать проблемы в большинстве сценариев.
Итак, как мы должны просматривать Spring AOP и AspectJ, цитируя оригинальный текст официальных документов весны:
Spring AOP никогда не будет бороться за то, чтобы конкурировать с AspectJ, чтобы обеспечить комплексное решение AOP. Мы считаем, что обе структуры на основе прокси, такие как Spring AOP, и полномасштабные рамки, такие как AspectJ, являются ценными, и что они полные, а не конкуренция. Весна плавно интегрирует Spring AOP и IOC с AspectJ, чтобы позволить всем использовать AOP для обслуживания в пределах последовательной архитектуры приложений на основе Spring. Эта интеграция не влияет на API Spring AOP или API AOP API: Spring AOP остается обратно.
Во всех конструкциях модуля Spring Framework один из основных принципов, которым всегда придерживается неинвазивна.
Поэтому, используя Spring AOP, мы не будем заставлять нас представлять конкретные классы или интерфейсы в бизнес -код, которые могут сохранить код в чистоте и отделить в максимальной степени. Тем не менее, Spring также предоставляет еще один вариант, если есть конкретный сценарий, вы можете напрямую ввести Spring AOP в вашем коде. Почти все модули в Spring Frameworks дадут вам различные варианты в том, как они используются, чтобы пользователи могли выбрать способ, который более подходит для их сценариев. Используйте AspectJ или Spring AOP, используйте метод аннотации или конфигурации XML, зависит от U.
После понимания первоначальных сценариев намерения и использования Spring AOP, давайте посмотрим на его общий принцип реализации
Большинство проблем в мире программного обеспечения могут быть решены путем добавления слоя.
Упомянутый здесь слой, конечно, в широком смысле, который может быть абстракцией или кэшем, что примерно означает категорию изоляции и развязки.
В весеннем мире введение каждого модуля или интеграция сторонних технологий всегда будет обеспечивать уровень абстракции, предоставляя унифицированный API пользователям, блокируя все детали реализации и различия между различными реализациями. Например, такие модули, как пружина, Spring-JDBC, Spring-JMS и Spirng-Messaging, все обеспечивают слой абстракции.
Реализация Spring AOP-это механизм на основе прокси, который по умолчанию использует JDK Dynamic Proxy, а также может использовать CGLIB Proxy. Разница между ними в основном заключается в разнице между прокси -объектами. Когда целевой объект является интерфейсом, динамический прокси JDK может заполнить прокси, но когда целевой объект не реализует класс интерфейса (старайтесь быть меньше, программирование, ориентированное на интерфейс, является хорошей привычкой), необходимо использовать прокси CGLIB для завершения прокси. Конечно, вы также можете заставить интерфейс использовать Cglib в качестве прокси; Кроме того, когда необходимо вводить конкретные типы или ссылки, если ссылочный объект является именно прокси -объектом, вам также необходимо использовать метод CGLIB.
Функциональный дизайн и реализация могут быть разделены на две основные части
Создание AOP
Класс Core, который генерирует объект Proxy, ProxyFactoryBean getObject ()
Следующий рисунок представляет собой логику выбора того, использовать ли JDK или CGLIB при генерации прокси:
После поиска конкретного исполнителя агента генерации, когда называется эта операция? Те, кто понял жизненный цикл весенних бобов, должны знать, что, когда создается боб, есть ряд интерфейсов обратного вызова, чтобы пользователи могли вставить пользовательское поведение, чтобы повлиять на некоторые характеристики бобов. Beanpostprocessor является одним из интерфейсов. Предыдущие статьи были введены (конечное оружие для игры с весенними бобами). Spring Aop воспользовался этой возможностью, чтобы вставить трюк в процессе создания бобов. Если созданный бон является нашей целью AOP, создайте прокси и, наконец, верните прокси -объект в МОК.
Abstractautoproxycreator Этот класс является реализацией Beanpostprocessor, используемой для создания прокси, см. Метод пост-обработки этого процессора и, наконец, возвращает прокси, возвращаемый методом CreateProxy ().
Усиленное выполнение секций AOP
Это можно понимать как призыв ко всем цепям перехватчиков на целевом объекте
Поскольку существует две конкретные реализации Spring AOP, JDK Dynamic Proxy и CGLIB, методы выполнения перехватчиков различны. Для получения подробной информации вы можете прочитать метод вызова исходного кода.
Призыв к целевому методу в конечном итоге опирается на RefertiveMethodinvocation.
Обработка процесса в RefertiveMethodinvocation использует рекурсивный метод для обработки цепочек перехвата.
Метод перехвата cglibaopproxy
Cglibmethodinvocation наследует отражает рефлексионный метод, и метод Process () выше используется для обработки цепей перехватчиков.
Две подробности отметить при использовании Spring AOP:
1. Spring AOP не работает при вызове метода внутри класса (самостоятельно), потому что внутренний вызов не проходит прокси-объект и используется напрямую. Решения:
2. При инъекции бобов, если вы хотите вводить конкретный тип бобов вместо интерфейса, затем используйте cglib
Spring AOP имеет мощные функции и умный дизайн. Основной контекст отсортирован здесь, и детали не будут обсуждаться один за другим.
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.