Одна из причин, по которой Spring AOP не используется по сравнению с AspectJ, заключается в том, что Spring AOP не может добавить аспект к чему-либо, что не создано фабрикой Spring. Что это значит? Разве все не создано из Spring Factory?
Короче говоря, Spring создает прокси для bean-компонентов в контейнере и полагается на эти прокси для реализации AOP.
Относительно сравнение с AspectJ:
Из справочных документов Spring.io:
"...
Таким образом, например, функциональность AOP Spring Framework обычно используется вместе с контейнер Spring Io C. Аспекты настраиваются с использованием обычного синтаксиса определения bean-компонента (хотя это позволяет использовать мощные возможности «автоматического проксирования»). Это принципиальное отличие от других реализаций AOP. Некоторые вещи не могут быть легко или эффективно выполнены с помощью Spring AOP, например, советуют очень мелкозернистые объекты (как правило, доменные объекты). AspectJ - лучший выбор в таких случаях. Однако наш опыт показывает, что Spring AOP предоставляет отличное решение для большинства проблем в приложениях Java предприятия, которые поддаются обработке. к АОП.
Весна АОП никогда не стремится к Совместно с AspectJ, чтобы обеспечить комплексное решение АОП. Мы считаем, что как основанные на прокси фреймворки, такие как Spring AOP, так и полноценные фреймворки, такие как AspectJ, ценны и дополняют друг друга, а не конкурируют. Spring полностью интегрирует Spring AOP и Io C с AspectJ, чтобы обеспечить все виды использования AOP в согласованной архитектуре приложений на основе Spring. Эта интеграция не влияет на API Spring AOP или API AOP Alliance. Spring AOP остается обратно совместимым. См. Следующую главу для обсуждения API-интерфейсов Spring AOP. "
Что означает" Spring AOP на основе прокси "? Как Spring Core использует модуль Spring AOP" за кулисами " ?
На основе прокси означает, что bean-объекты обернуты в другом объекте (прокси-сервере), который распознает вызовы объекта и может воздействовать на этот перехват перед вызовом реального метода для обернутого объекта.
Существует два способа реализации этого: один использует java Dynami c Proxys (Reflection), другой использует CGLIB, библиотеку, которая добавляет возможность прокси на уровне байт-кода.
Spring.io справочные документы AOP
Статья о Proxys