Динамическое выражение Pointcut. - PullRequest
1 голос
/ 28 марта 2012

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

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

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

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

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

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

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

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

Заранее большое спасибо!

1 Ответ

1 голос
/ 20 апреля 2012

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

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

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

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

спасибо!

...