首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java和注入防御副本

Java和注入防御副本
EN

Stack Overflow用户
提问于 2011-10-13 18:52:37
回答 1查看 307关注 0票数 0

因此,为了使代码更加“安全”,我开始非常喜欢防御性拷贝的概念,但不幸的是,它们似乎与AOP所处理的关注点的完美分离有着内在的冲突。

我的意思是,在介绍AOP之前,我将手动验证所有方法的参数,如下所示:

代码语言:javascript
复制
public void doSomething(final int p_iAge, final Widget p_oWidget)
        throws IllegalArgumentException
{
    if(p_oWidget == null)
        throw new IllegalArgumentException();

    // ...
}

现在,我使用验证我的方法,并通过AOP处理抛出的任何异常。这很好地清理了我的代码,并分离了我的业务逻辑(我真正感兴趣的是什么!)从枯燥乏味的验证检查,异常抛出等。

但是现在我开始喜欢制作防御性拷贝的概念了,我开始正确地使用那些看起来又一样的方法:

代码语言:javascript
复制
@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)。

在这个(一般)范型下,我想代码会是这样的:

代码语言:javascript
复制
@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");

    // ...
}

现在是oWidgetp_oWidget的防御性副本,我不需要手动编写它。节省了大量的时间,而且我对AOP的强迫症很满意!

但我甚至不确定AOP框架(如AspectJ/AOP联盟)和IoC框架(如Spring或Guice )是否会支持这样的概念。

我也非常尊重SO社区,并希望在此提供一些一般性意见--评论/建议/等等。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-13 19:33:43

AspectJ的around建议允许您在使用ProceedingJoinPoint#proceed(Object[])时向被截获的方法提供自己的参数。

在通知中,您可以检查给定参数是否可以复制--在您的示例中,可以使用反射查找一个声明的构造函数,该构造函数接受对象类型的单个参数,或者选择标记要进行防御复制的对象,然后使用副本而不是原始参数继续使用该方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7759000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档