有没有理由代理单例bean?

时间:2016-12-18 05:15:07

标签: java spring dependency-injection proxy inversion-of-control

我在代码中看到了以下定义:

@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)
@Component
public class SomeComponent {
  <...>
}

这是一个单例范围的bean。在我看来,没有理由代理它。据我所知,如果bean的范围不是单例并且与另一个bean的范围不同,我们应该代理一个bean,我们将把它注入其中。

可能我不知道什么。代理单身人士可能是什么原因?

2 个答案:

答案 0 :(得分:0)

经过调查,我在an outdated Spring's documentation找到了我的问题的答案:

  

您不需要将<aop:scoped-proxy/>与作为单例或原型作用域的bean结合使用。尝试为单例bean创建范围代理是错误的(结果BeanCreationException肯定会在这方面让你直截了当。)

它回答了我的问题,因为<aop:scoped-proxy/>@Scope注释的替代方案。但current documentation与旧版不同:

  

您也可以在作为单例的作用域之间使用<aop:scoped-proxy/>,然后引用通过可序列化的中间代理,从而能够在反序列化时重新获取目标单例bean。

这意味着,如果您尝试定义单例范围的代理,现在您将看不到BeanCreationException。但无论如何,我并不完全理解这个模糊用例的目的。所以,如果有人理解这个陈述的含义,请在评论中澄清。

结论:在大多数情况下,没有理由代理单例作用域。

答案 1 :(得分:0)

关于范围代理:这是用Spring documentation写的。

  

注意:

     

您不需要与作为单例或原型作用域的bean一起使用。尝试为单例bean创建作用域代理是一个错误(在这方面,生成的BeanCreationException肯定会让你直截了当。)

虽然它指的是一个相当老的版本,但该注释仍然是有效的IMO。我自己从来没有试过这个。

话虽如此,代理单例bean有很多理由,&#34;代理&#34;是一个非常广泛的概念。例如,当我们使用@Transactional代理时,还有许多其他示例。问题是,这不是一个&#34;范围的代理&#34;这可以被视为一种非常特殊的代理,显然不适用于单身人士。