Аспект подловить создание контроллера в проекте Roo - как?

Я хотел бы, чтобы мой первый проект Aspect в Roo запускал совет при запуске веб-контроллера. Но я не могу заставить pointcut соответствовать.

Контроллеры имеют имя класса, начинающееся с Cfx. Я пытался с помощью следующей формы:

pointcut setBrand() : initialization(Cfx*.new (..));

before()  : setBrand()
{
    log.info("xxxxxxxxxxxx  setting brand");
}

Помимо "инициализации" я попытался (из книги AspectJ Cookbook) вызвать (Signature) новое ключевое слово, преинициализацию, статическую инициализацию. Какая формула?

Возможно, это связано с тем, что аспекты Roo не имеют этой формы, например, нет pointcut. Как они работают? Где это задокументировано?

Спасибо

PS извиняюсь, это перепост. Я разместил это на форуме Spring Roo, но не получил ответа. http://forum.springsource.org/showthread.php?129374-Aspect-to-trap-Controller-creation-how-to

1 ответ

Решение

Я почти ничего не знаю о Roo или Spring, но о некотором AspectJ, поэтому я собираюсь ответить на ваш вопрос только с точки зрения AspectJ, предполагая, что вы новичок в AOP (извините, если мои предположения неверны):

  • Если вы хотите что-то сделать, когда класс загружен, используйте staticinitialization(TypePat) срез точек.
  • Если вы хотите что-то сделать при создании объекта (экземпляра), используйте что-то вроде execution(ConstructorPat), initialization для специальных целей и preinitialization нужен еще реже. Я предполагаю, что первый сделает для вас, не зная вашей точной цели.
  • Далее предполагая, что что-то вроде execution(Cfx*.new (..)) это в основном то, что вам нужно, я предлагаю вам взглянуть на возможные ошибки или предупреждения, такие как "совет, определенный в... не был применен [Xlint:adviceDidNotMatch]", потому что это может быть просто проблема с совпадением точек. Обратите внимание, что используемый вами шаблон типа предполагает, что соответствующие конструкторы находятся в том же пакете, что и аспект, и что они имеют стандартную видимость (не общедоступную или что-либо еще). Поэтому, если не возникает проблема с загрузкой классов, возможно, вы просто хотите указать более точно (или в более общем смысле), что вы хотите сопоставить. Примеры:
    • com.bigboxco.my_app.Cfx*.new(..)
    • com.bigboxco..Cfx*.new(..)
    • public com.bigboxco..Cfx*.new(..)
    • !private com.bigboxco..Cfx*.new(..)
    • * com.bigboxco..Cfx*.new(..)

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

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

Другие вопросы по тегам