Spring bean必须代表一个独特的对象吗?

时间:2016-09-06 14:31:55

标签: java spring

Spring bean可以作为另一个bean的引用吗?它似乎不起作用:

<bean id="player1" class="some.package.Player" />
<bean id="player2" ref="player1" />

如果可以的话,它有用吗?到目前为止,我认为每个bean都必须代表一个独特的对象,但是我的脑子里有一些想法:如果我有一个Singleton类,例如Sun使用“public static Sun getInstance()”方法,我会让两个bean成为同一个对象吗?

<bean id="sun1" class="some.package.Sun" factory-method="getInstance" />
<bean id="sun2" class="some.package.Sun" factory-method="getInstance" />

2 个答案:

答案 0 :(得分:2)

看下面的

  

<bean id="player1" class="some.package.Player" />

     

<bean id="player2" ref="player1" />

我想你想用两个或多个名字引用同一个bean。如果是这样,您可以将逗号分隔的列表或ID作为(别名概念)

<bean id="player1, player2" class="some.package.Player" />

现在你可以使用player1或player2引用bean。

类似地,

  

<bean id="sun1" class="some.package.Sun" factory-method="getInstance" />   <bean id="sun2" class="some.package.Sun" factory-method="getInstance" />

可以替换为

<bean id="sun1, sun2" class="some.package.Sun" factory-method="getInstance" />

这允许您使用两个不同的ID引用相同的bean。

要了解别名何时有用,请引用https://vladmihalcea.com/why-i-like-spring-bean-aliasing/

  

Bean别名允许我们覆盖已经配置的bean和   用不同的对象定义替换它们。这是最多的   当bean定义从外部继承时很有用   资源,这是我们无法控制的。

答案 1 :(得分:0)

Bean通常是单一的,因此它们代表一个对象每个上下文。 java中的标准单例设计模式为每个类加载器创建一个对象 。我认为在你的情况下你将重新创建一个对象两次,一次使用Spring bean,一次使用自己的类加载器执行实现。因此,当您通过.getInstance().hashCode()比较哈希码时,两个太阳都是相同的。