Подтвердить что ты не робот

Для чего нужен AspectJ?

Сначала позвольте мне заметить, что я использую AspectJ, и мне это нравится, но что еще я могу с ним сделать.

Я знаю, что AspectJ может быть/используется для ведения журнала. В некоторых случаях он используется для управления транзакциями - в основном, в сочетании с аннотациями. AspectJ также может использоваться для улучшения классов с помощью (генерируемых кодом) методов, таких как Spring Roo.

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

Итак, какие другие полезные варианты использования для AspectJ и AOP?

4b9b3361

Ответ 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 Аспект)