Так что мне действительно нравится концепция защитных копий с целью сделать код более "безопасным", но, к сожалению, они, похоже, по своей сути конфликтуют с замечательным разделением интересов адресовано АОП.
Под этим я подразумеваю, что до того, как меня представили в AOP, я бы вручную проверил аргументы для всех своих методов, например:
public void doSomething(final int p_iAge, final Widget p_oWidget)
throws IllegalArgumentException
{
if(p_oWidget == null)
throw new IllegalArgumentException();
// ...
}
Теперь я использую Apache Bean Validator для проверки своих методов, и все возникающие исключения я обрабатываю с помощью AOP. Это хорошо очищает мой код и отделяет мою бизнес-логику (что меня действительно интересует!) От скучной, скучной проверки правильности, выдачи исключений и т. Д.
Но теперь, когда мне начинает нравиться концепция создания защитных копий, я начинаю выбирать правильные методы, которые снова выглядят одинаково:
@NotNull(message="Widget cannot be null.")
public void doSomething(final int p_iAge, final Widget p_oWidget)
{
Widget oWidget = new Widget(p_oWidget);
// ...
}
Итак, мой вопрос:
Существует ли де-факто способ использования AOP / IoC (любой фреймворк! - я в отчаянии!) Для написания совета / pointcuts, который выделит эту скучную, утомительную (ха!) Задачу написания вручную защитные копии и внедрение их обратно в локальный (метод) объект? Таким образом, я мог бы получить преимущества безопасности защитных копий при всей чистоте AOP / IoC.
Я полагаю, что мне пришлось бы написать совет, который перехватывает все методы и использует внедрение зависимостей, чтобы каким-то образом создавать объединенные / управляемые экземпляры параметров этих методов; эти экземпляры будут защитными копиями. Затем, вернувшись в свои целевые классы, я мог использовать IoC, чтобы получить доступ к этим защитным копиям (бобам).
В соответствии с этой (общей) парадигмой, я думаю, что код будет выглядеть следующим образом:
@NotNull(message="Widget cannot be null.")
public void doSomething(final int p_iAge, final Widget p_oWidget)
{
// By the time we get here, bean validation has already made sure
// that p_oWidget isn't null, and the AOP method interceptor has already
// executed and created the "defensive-widget" bean.
Widget oWidget = springOrWhateverInjector.getBean("defensive-widget");
// ...
}
Теперь , oWidget
является защитной копией p_oWidget
, и мне не нужно писать ее вручную. Огромная экономия времени, и мой OCD с AOP доволен!
Но я даже не уверен, поддерживают ли такие концепции AOP, как AspectJ / AOP Alliance и IoC, такие как Spring или Guice.
Я также испытываю огромное уважение к сообществу SO и хотел бы получить общий вклад здесь - комментарии / рекомендации / и т.д. Заранее спасибо!