Комментарии 8
Где-нибудь в продакшене используется?
Везде где есть спринг
Spring не обязательно в продакшене с AOP
"все решения с декораторами (включая AOP) обладают одним общим недостатком. Они могут добавлять логику только в начале и конце метода. Т.е. всюду, где мы не можем задекорировать предлагается использовать наблюдателей.
В этом смысле получается, что паттерн наблюдатель более универсальное решение, чем декоратор для задачи внедрения произвольной логики"
https://habr.com/ru/post/582588/comments/#comment_23623770
"Предлагаю рассмотреть интересную аналогию
Если к примеру взять задачу исключительно по блокировкам, то решениям с декоратором вы можете сопоставить блок synchronize {} в java, причем который вы можете добавлять только на метод целиком. Т.е. на самом деле даже получается не блок synchronize, а именно ключевое слово дополнительное к сигнатуре метода.
А решениям с наблюдателями, можно сопоставить использование ReentrantLock, которые позволяют в любом месте захватить блокировку и отпустить."
Все зависит от конкретных целей. Аспекты вещь полезная. Позволяют переиспользовать логику. Но они не претендуют на самое универсальное решение. Любой инструмент нужен для конкретных целей. И для проксирования АОП хорошее решение
Если у вас сквозная функциональность нужна посреди метода бизнес-логики, то стоит задуматься либо о том, реально ли это сквозная функциональность, либо грамотно ли декомпозирован код. Еще стоит задуматься, стоит ли выносить синхронизацию в сквозную функциональность. Сомнительно, что коллеги будут вам благодарны.
Спору нет, код бывает всякий, - но спринговый механизм успешно закрывает 99% кейсов. Труднее найти код, где аспектов нет. Я в курсе, что есть пуристы и сектанты, которым любой спринговый сахар как ножом по сердцу. Но в среднестатистическом приложении менеджмент транзакций - аспект, логирование запросов - аспект, обработка исключений в контроллерах - аспект.
Перформанс можно довести до максимума если использовать aspectj компилятор. Тогда аспекты будут навешиваться при компиляции без использования прокси.
Много лет назад Евгений Борисов в своем спринг потрошителе проводил перфоманс тест по использованию Spring AOP и ручному созданию динамических прокси через BeanPostProcessor + Proxy.newProxyInstance. По его результатам Spring AOP был сильно медленнее именно при вызове методов. Может кто-нибудь знает какие-то новые исследования на эту тему, поменялось ли что-то спустя время?
Spring AOP: как работает проксирование