Аспект подловить создание контроллера в проекте 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(..)
Хорошей стратегией может быть попытка сопоставить один из ваших конструкторов, реплицируя его точную сигнатуру и используя его полностью определенное имя класса, а затем работать над этим, чтобы сделать его более общим.
Обновление: я знаю, что вы можете сделать поиск в Интернете самостоятельно, но в любом случае вот несколько полезных ссылок:
- AspectJ краткий справочник
- Семантика языка AspectJ с темами о сигнатурах, сопоставлении и т. Д.