2012-03-27 2 views
1

Вот что, я работал над решением мониторинга с AOP, которое может быть распространено на любой компонент. Я постараюсь нарушить свою озабоченность в областях.Динамическое выражение Pointcut.

Идея:
Имейте механизм, который позволяет определять динамические выражения pointcut на основе типов, которые являются фасолью Spring.

Что я сделал:
создал компонент, который реализует ApplicationContextAware, который проверяет пружинный контекст и делает список всех типов боба и имена, которые следует учитывать для Pointcut.

Проблема:
Проблема в том, что на данный момент я не могу переопределить или использовать какой-либо Pointcut, так как процесс Spring AOP уже создал проксированные объекты.

Что я пробовал:
• Реализована моя собственная Pointcut, советник и совет, которая сравнивается с моим списком бобов, однако, это игнорируется.
• Реализована PointcutFactoryBean, которая была бы той, которая предоставляет Pointcut для уже объявленного советника.
• Пробовал модифицировать уже объявленный Pointcut (добавление нового выражения на основе beanIds) и связать его с BeanNameAutoProxyCreator с помощью Interceptor, связанного с этим Pointcut. Так, чтобы это имело, например:
bean (bean1) || bean (otherBean) и т. д.

Со всеми этими попытками я наткнулся на одну и ту же проблему, все уже определено и не может быть изменено из контекста.

Вопрос:
Возможно ли это сделать с Spring AOP? Мы не хотим привлекать к этому какие-либо вопросы AspectJ, такие как плетение и т. Д. ... Подводя итог, я ищу способ создания выражения pointcut и назначить его pointcut при запуске приложения, принимая учитывая все бобы.

Надеюсь, что я был ясен, если нет, сообщите мне, и я сделаю все возможное, чтобы предоставить дополнительную информацию или код.

Большое спасибо!

ответ

0

смог сделать это, создав свою собственную реализацию каждого класса, связанного с АОП:

  • Pointcut.
  • MethodMatcher.
  • ParentsAdvisor.
  • ClassFilter.

И инициировать их непосредственно с помощью Spring, добавив пустой элемент aop: config в контексте Spring, было достаточно, чтобы эта работа безупречно работала.

Если кому-то нужна дополнительная информация, просто дайте мне знать.

Спасибо!

+0

Есть ли способ создать динамические точки без пружины, просто aspectj? Я ищу, чтобы создать pointcut с некоторыми параметрами, такими как имя класса или пакета, поступающие с пользовательского ввода.Спасибо – AbhilashK

+0

Да, но вам понадобится привязка к вашим объектам, в основном в том случае, когда Spring AOP помогает вам. http://www.adevedo.com/content/using-aspectj-log-all-methods-parameters-and-return-values-during-application-runtime – LdSe

+0

@AbhilashK можно применить динамическое выражение для точечного сокращения во время выполнения для контроля выполнения метода. Кроме того, если возможно создать/уничтожить новый компонент аспект (вместо изменения выражения точечной резки). Случай использования такой же, как вы упомянули, когда нам нужно найти какую-то ошибку или время выполнения выполнения метода, мы предоставляем эти рекомендации в процессе производства и отключаем один раз, когда монитор не нужен. – Nitul