Unter Verwendung der Methode Injektion macht die Singleton-Bean-Klasse schwer zu Unit-Test (Sie müssen eine Unterklasse erstellen zu implementieren die Methode, die die Abhängigkeit ausgibt). Außerdem ist es weniger wiederverwendbar, da Sie es nicht direkt instantiieren können. Wenn Sie also nicht Spring verwenden und diese Klasse verwenden möchten, müssen Sie die Bean-Rückgabe-Methode unterklassen und bereitstellen.
Ein besserer Ansatz IMHO ist die Verwendung eines Proxy, einer Zielprototypenquelle und einer Zielbohne des Prototyps, wie folgt. Solch eine Singleton-Bean-Klasse ist leicht unit-testbar und besser wiederverwendbar.
<bean id="targetPooledObject" class="pool.PooledObject" scope="prototype">
<constructor-arg value="42" />
</bean>
<bean id="prototypeTargetSource" class="org.springframework.aop.target.PrototypeTargetSource">
<property name="targetBeanName" value="targetPooledObject" />
</bean>
<bean id="pooledObject" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="targetSource" ref="prototypeTargetSource" />
</bean>
<bean id="poolConsumer" class="pool.PoolConsumer">
<property name="pooledObject" ref="pooledObject" />
</bean>
Jetzt können wir pooledObject
in eine Singleton Bohne injizieren (poolConsumer
wie oben dargestellt) und für jeden Methodenaufruf, die wir auf dieser Singleton Bohne machen (zB jedes Mal, wenn wir poolConsumer.callPooledObjectMethod()
die pooledObject.foo()
wiederum nennen nennt) wir Hol dir eine neue PooledObject-Bean.
Es folgt der entsprechende Code:
public class PooledObject
{
private int x;
public PooledObject(int x)
{
this.x = x;
}
public void foo()
{
System.out.println("foo called");
}
}
public class PoolConsumer
{
private PooledObject pooledObject;
public PooledObject getPooledObject()
{
return pooledObject;
}
public void setPooledObject(PooledObject pooledObject)
{
this.pooledObject = pooledObject;
}
public void callPooledObjectMethod()
{
pooledObject.foo();
}
}
Diese Antwort ist veraltet, wie Christopher sagte, seit Frühjahr 3.0 ist das ' ' Element der richtige Weg dazu. Wie von shrini1000 gezeigt, macht die Methodeninjektion die Klasse unbeholfen zu testen. –