Для чего нужен AspectJ?
Сначала позвольте мне заметить, что я использую AspectJ, и мне это нравится, но что еще я могу с ним сделать.
Я знаю, что AspectJ может быть/используется для ведения журнала. В некоторых случаях он используется для управления транзакциями - в основном, в сочетании с аннотациями.
AspectJ также может использоваться для улучшения классов с помощью (генерируемых кодом) методов, таких как Spring Roo.
Но я считаю, что AspectJ и AOP в целом могут использоваться для более чем: ведения журнала, контроля транзакций и частичных классов моделирования.
Итак, какие другие полезные варианты использования для AspectJ и AOP?
Ответы
Ответ 1
- проверка прав
- действие прерывания, которое занимает слишком много времени
- запустить действие в отдельном потоке или даже в контексте другого процесса или события на другой машине.
- контроль
- подготовка любых данных/среды до вызова и обработки результатов после вызова
- ресурсы открытия/закрытия
ИЗМЕНИТЬ
Хотя прошло много лет с тех пор, как я дал этот ответ, я решил добавить следующее, чтобы сделать ответ более полным.
- проверка безопасности.
- исправления неправильного или поведения API, которые вы не можете изменить. Например, boolean метод, который возвращает
false
в некоторых условиях, но должен возвращать true
. Вы можете исправить это с помощью AspectJ.
Ответ 2
Wikipedia entry дает вам еще несколько примеров (но не так много). Как правило, Aspect Oriented Programing следует использовать только для реализации простых действий, которые не являются частью основной проблемы класса и являются общими для разных классов. Как только вы начнете вводить слишком много логики в своих аспектах, код становится действительно нечитаемым.
Наиболее часто используемый аспект, который вы предлагаете (протоколирование, транзакция,...). Я бы добавил безопасность.
Ответ 3
Можно использовать AspectJ для применения некоторых (дизайн) правил.
Inject Mocks в классах, которые в противном случае создавали бы новые экземпляры с помощью new.
Предположим, что у вас есть этот код:
public void sendInvitationEmail(String address) {
InvitationEmail email = new InvitationEmail();
email.sendTo(address).send();
}
И нужно заменить email
макетом. Затем вы можете использовать Aspect (@Pointcut("call(InvitationEmail.new(..))")
) для "инъекции" макета. - @See Блог JMock и AspectJ от Daniel Roop, а также Spring Roo`s @MockStaticEntityMethods (Мотыльные статические методы с использованием Spring Аспект)