Для чего хорош AspectJ? [закрытый]

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

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

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

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

3 ответов


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

редактировать

хотя прошло много лет с тех пор, как я дал этот ответ, я решил добавить после того чтобы сделать ответ более полным.

  • проверка безопасности.
  • исправления неправильного или поведения API, которое вы не можете изменить. Например, логический метод, который возвращает false в некоторых условиях, но должен возвратить true. Вы можете исправить это с помощью AspectJ.

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

аспект, который вы предлагаете (ведение журнала, транзакция,...) наиболее часто используются. Я бы также добавил безопасность.


можно использовать AspectJ для применения некоторых правил (дизайна).


Inject Mocks в классах, которые в противном случае создали бы новые экземпляры с помощью new. Предположим, у вас есть это код:

public void sendInvitationEmail(String address) {
    InvitationEmail email = new InvitationEmail();
    email.sendTo(address).send();
}

и нужно заменить email по глумиться. Тогда вы можете использовать аспект (@Pointcut("call(InvitationEmail.new(..))") ), чтобы "впрыснуть" макет. -- @See блог JMock и AspectJ Даниэль РУП, а также Spring Roo's @MockStaticEntityMethods (макет статических методов с использованием Spring Aspect)