2015-04-01 3 views
0

В настоящее время я работаю над приложением, которое должно быть интегрировано в любое веб-приложение на основе Spring, чтобы позволить пользователю определять динамические точечные ссылки, изменяя значение аннотации @Pointcut во время выполнения , Моя основная цель - переключить метод, с которым соткается определенный аспект, пока приложение все еще работает.Изменение выражений pointcut во время выполнения с использованием Spring AOP

До сих пор я работал над запуском контекста приложения Spring, определяющего класс аспект из основного метода и изменяющего значение аннотации через Reflection. Однако мне показалось, что это изменение не повлияло на прокси-объект, созданный Spring. Аспект все еще был сплетен и вызывается в соответствии с исходным значением @Pointcut до того, как были применены мои изменения. Идея попробовать это подошла ко мне, потому что согласно «Весна в действии» и документации Spring эти прокси-объекты создаются во время выполнения. Поэтому я пришел к выводу, что должен быть способ обеспечить изменения времени выполнения.

Кто-нибудь знает, есть ли другой способ, кроме моего подхода, чтобы получить эту работу, используя Spring AOP? Я с нетерпением жду ваших идей и мнений!

EDIT: Важно, чтобы мое решение оставило существующий код незатронутым, если это возможно. Поэтому добавление или замена методов в beans - это не вариант для меня.

ответ

2

Есть 2 способа сделать то, что вы хотите.

Spring Method Injection. (Добавить новый метод) и Method Replacer (Заменить метод в бобе)

Идеально, если это для единовременные фасоли и не для набора бобов.

Around Aspect.

Идеально, если вам нужно использовать точку-вырезать и применить к набору неизвестного количества бобов. Важно: только аспект AROUND может обходить фактический целевой вызов. И это делается простым пропуском (или вызывающим условно) методом proceedingJointPoint.proceed(...).

Выберите лучшее, что подходит именно вам.

+0

Спасибо за ваш ответ Yazad! Предлагая добавить или заменить метод, я думаю, вы думаете об изменении, например. сервисный компонент? Для моего решения важно изменить существующие компоненты. Извините, я должен был упомянуть об этом. Знаете ли вы, что ваше решение также работает с прокси-серверами, созданными Spring? – pklndnst

+0

Вы не обязательно меняете компонент - вы изменяете конфигурацию для построения компонента. –

+0

К сожалению, для этого проекта я не могу изменить конфигурацию Spring. Поэтому я ищу решение, которое полностью не затрагивает целевые компоненты и их конфигурацию. Я могу манипулировать только своим классом аспектов ... – pklndnst

Смежные вопросы