因此,为了使代码更加“安全”,我开始非常喜欢防御性拷贝的概念,但不幸的是,它们似乎与AOP所处理的关注点的完美分离有着内在的冲突。
我的意思是,在介绍AOP之前,我将手动验证所有方法的参数,如下所示:
public void doSomething(final int p_iAge, final Widget p_oWidget)
throws IllegalArgumentException
{
if(p_oWidget == null)
throw new IllegalArgumentException();
// ...
}现在,我使用验证我的方法,并通过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的实际方法(任何框架!-我绝望了!)写一些建议/切入点,把这些枯燥、艰辛的东西分开(哈!)手动编写防御性副本并将它们注入本地(方法)对象?的任务这样,我就可以获得防御性副本的安全好处,并且具有AOP/IoC的所有整洁性。
我想,我将不得不编写一些建议来拦截所有方法,并使用依赖注入来以某种方式创建该方法参数的池/托管实例;这些实例将是防御性副本。然后,回到我的目标类中,我可以使用IoC来访问这些防御性副本(Bean)。
在这个(一般)范型下,我想代码会是这样的:
@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的防御性副本,我不需要手动编写它。节省了大量的时间,而且我对AOP的强迫症很满意!
但我甚至不确定AOP框架(如AspectJ/AOP联盟)和IoC框架(如Spring或Guice )是否会支持这样的概念。
我也非常尊重SO社区,并希望在此提供一些一般性意见--评论/建议/等等。谢谢!
发布于 2011-10-13 19:33:43
AspectJ的around建议允许您在使用ProceedingJoinPoint#proceed(Object[])时向被截获的方法提供自己的参数。
在通知中,您可以检查给定参数是否可以复制--在您的示例中,可以使用反射查找一个声明的构造函数,该构造函数接受对象类型的单个参数,或者选择标记要进行防御复制的对象,然后使用副本而不是原始参数继续使用该方法。
https://stackoverflow.com/questions/7759000
复制相似问题