Для чего хорош AspectJ? [закрытый]
сначала позвольте мне отметить, что я использую AspectJ, и мне это нравится, но что еще я могу с ним сделать.
Я знаю, что AspectJ может быть использован для входа. В некоторых случаях он используется для управления транзакциями-в основном реализуется в сочетании с аннотациями. AspectJ также можно использовать для улучшения классов с помощью (генерируемых кодом) методов, таких как Spring Roo.
но я считаю, что AspectJ и AOP в целом могут использоваться для большего, чем: ведение журнала, управление транзакциями и моделирование разделяемый класс.
Итак, каковы другие полезные варианты использования для AspectJ и AOP?
3 ответов
- разрешение проверки
- прерывание действия, которое занимает слишком много времени
- выполнить действие в отдельном потоке или даже в контексте другого процесса или события на другие машины
- мониторинг
- подготовка любых данных / среды перед вызовом и обработка результатов после вызова
- открытие / закрытие ресурсов
редактировать
хотя прошло много лет с тех пор, как я дал этот ответ, я решил добавить после того чтобы сделать ответ более полным.
- проверка безопасности.
- исправления неправильного или поведения API, которое вы не можете изменить. Например, логический метод, который возвращает
false
в некоторых условиях, но должен возвратитьtrue
. Вы можете исправить это с помощью AspectJ.
на Википедии дает вам еще несколько примеров (но не так много). Как правило, аспектно-ориентированное программирование должно использоваться только для реализации простых моделей поведения, которые не являются частью основной задачи класса и являются общими для разных классов. Как только вы начинаете вкладывать слишком много логики в свои аспекты, код становится действительно нечитаемым.
аспект, который вы предлагаете (ведение журнала, транзакция,...) наиболее часто используются. Я бы также добавил безопасность.
можно использовать AspectJ для применения некоторых правил (дизайна).
- как каждый метод контроллера нужны некоторые специальные аннотации
- каждый класс service / frontend/dto должен быть расположен в сервисе/fronten / DTO pacakge
- более зрелые думает, как:проверка того, что сеттеры не имеют никакой логики.
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)