АОП (аспектно-ориентированное программирование), которое является дополнением к объектно-ориентированному программированию, в основном используется для работы с некоторыми службами системного уровня со сквозными свойствами, такими как сбор журналов, управление транзакциями, проверка безопасности, кэширование, управление пулом объектов. , так далее.
Ключом к реализации АОП является прокси-сервер АОП, автоматически создаваемый инфраструктурой АОП. Прокси-сервер АОП можно разделить на две категории: статический прокси-сервер и динамический прокси-сервер. он может быть сгенерирован на этапе компиляции.Класс прокси-сервера АОП, поэтому его также называют расширением времени компиляции; в то время как динамический прокси-сервер создает динамический прокси-класс АОП «временно» в памяти во время выполнения с помощью динамического прокси-сервера JDK, CGLIB и т. д. , поэтому его также называют улучшением во время выполнения.
Аспектно-ориентированное программирование (АОП) — это парадигма программирования, предназначенная для улучшения модульности за счет разделения сквозных задач. АОП предоставляет аспекты для модульного разделения задач по объектам.
Чего хочет достичь АОП, так это выполнения определенной упаковки на основе кода, который мы пишем, например обработки перехвата или обработки расширения до выполнения метода, или после выполнения, или после возникновения исключения во время выполнения.
Концепция АОП
Pointcut: это (групповое) выражение, основанное на регулярных выражениях, которое немного окольное, то есть это само выражение, но оно основано на регулярной грамматике. Обычно pointcut выбирает некоторые точки выполнения в интересующей нас программе или набор точек выполнения программы.
JoinPoint: Конкретная точка выполнения в наборе, выбранном pointcut, мы называем ее JoinPoint.
Advice: Операция и логика, которые должны быть выполнены на выбранной точке соединения. По поводу 5 типов много говорить не буду, а студенты, которые не понимают, составляют основу сами.
Aspect: модульность нашего внимания. Эта проблема может быть сквозной для нескольких объектов и модулей, управление транзакциями является хорошим примером сквозной проблемы. Это абстрактное понятие, которое с точки зрения программного обеспечения относится к определенной области или аспекту в различных модулях приложения. Он состоит из pointcut и совета.
Weaving: процесс применения аспекта к целевому объекту для создания нового рекомендуемого объекта.
Что такое Аспект J? Что может быть сделано?
AspectJ — это простая в использовании мощная АОП-инфраструктура.
Полное название AspectJ — Eclipse AspectJ, а адрес официального сайта:www.eclipse.org/aspectj/, в настоящее время…
Цитирую описание официального сайта:
- бесшовное аспектно-ориентированное расширение языка программирования Javatm
- Совместимость с платформой Java (совместимость с платформой Java, возможность плавного расширения)
- прост в освоении и использовании
Может использоваться отдельно или интегрироваться в другие фреймворки.
Использование только AspectJ требует использования специализированного компилятора ajc.
Компилятор java — это javac, компилятор AspectJ — это ajc, aj — это аббревиатура, а c — это компилятор.
Разница между AspectJ и Spring AOP?
Я считаю, что как разработчики Java мы все знакомы с инфраструктурой Spring.Одной из основных функций в инфраструктуре Spring является АОП.Когда мы упоминаем АОП, мы часто думаем об AspectJ.Позвольте мне провести простое сравнение между AspectJ и Spring AOP :
Spring AOP
1. Он реализован на основе динамического прокси.По умолчанию, если используется интерфейс, он реализуется динамическим прокси, предоставляемым JDK.Если это метод, он реализуется CGLIB.
2, Spring AOP использует контейнер IOC для управления и может работать только с контейнером Spring, реализованным в чистом Java-коде.
3. С точки зрения производительности, поскольку Spring AOP реализован на основе динамических прокси, экземпляры прокси необходимо генерировать при запуске контейнера, а глубина стека также будет увеличиваться при вызовах методов, что делает производительность Spring AOP не такой хорошо, как у AspectJ.
AspectJ
-
AspectJ от Eclipse Foundation
-
AspectJ относится к статическому плетению, которое реализуется путем модификации кода.Существуют следующие возможности плетения:
1. Сплетение во время компиляции: если класс A использует AspectJ для добавления атрибута, а класс B ссылается на него, этот сценарий требует сплетения во время компиляции, иначе класс B не может быть скомпилирован.
2. Сплетение после компиляции: то есть файл .class был сгенерирован или упакован в пакет jar.В этом случае, если нам нужно улучшить обработку, мы должны использовать сплетение после компиляции.
3. Переплетение во время загрузки: относится к переплетению при загрузке классов.Для достижения переплетения в этот период существует несколько распространенных методов. 1. Настройте загрузчик классов, чтобы сделать это.Это должен быть самый простой способ думать об этом.Загрузить тканый класс до того, как он будет загружен в JVM, чтобы поведение можно было определить во время загрузки. 2. Укажите агента, предоставленного AspectJ, при запуске JVM:-javaagent:xxx/xxx/aspectjweaver.jar
.
-
AspectJ может делать то, чего не может Spring AOP. Это комплексное решение для АОП-программирования. Spring AOP предназначен для решения наиболее распространенных АОП (переплетение методов) в корпоративной разработке. вместо того, чтобы быть схемой АОП, такой как AspectJ
-
Поскольку AspectJ завершает плетение перед фактическим выполнением, генерируемые им классы не имеют дополнительных издержек во время выполнения.
Резюме сравнения
В следующей таблице приведены основные различия между Spring AOP и AspectJ:
Spring AOP | AspectJ |
---|---|
Реализовано на чистой Java | Расширенная реализация с использованием языка программирования Java |
Не требуется отдельный процесс компиляции | Требуется компилятор AspectJ (ajc), если не установлен LTW |
Используйте только плетение во время выполнения | Прошивка во время выполнения недоступна. Поддержка времени компиляции, пост-компиляции и времени загрузки |
Не очень мощный - поддерживает только плетение на уровне методов. | Более мощный - может сплести поля, методы, конструкторы, статические инициализаторы, окончательные классы/методы и т.д.... |
Может быть реализовано только для bean-компонентов, управляемых контейнером Spring. | Может быть реализован на всех предметных объектах |
Поддерживаются только точки выполнения метода | Поддерживаются все точки |
Прокси создаются целевыми объектами, и к этим прокси применяются аспекты. | Аспекты вплетаются непосредственно в код перед выполнением приложения (во время выполнения) |
Гораздо медленнее, чем AspectJ | лучшая производительность |
Легко учиться и применять | Более сложный, чем Spring AOP |
Если содержание статьи для вас полезно, обратите внимание на публичный номер:优享JAVA(ID:YouXiangJAVA)
, есть больше технических галантереи, и список книг программиста был тщательно подготовлен. с нетерпением ждем вашего визита!