El uso de la inyección método hace que la clase Singleton-frijol difícil unidad de prueba (es necesario crear una subclase de implementar el método que da la dependencia). Además, es menos reutilizable porque no puedes instanciarlo directamente, por lo que si no estás usando Spring y quieres utilizar esta clase, deberás crear una subclase y proporcionar el método de devolución de beans.
Un mejor enfoque en mi humilde opinión es utilizar un proxy, un prototipo de fuente de destino y un prototipo de frijol objetivo, de la siguiente manera. Tal clase de singleton-bean es fácilmente comprobable por unidad y mejor reutilizable.
<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>
Ahora podemos inyectar pooledObject
en un grano de Singleton (poolConsumer
como se muestra arriba), y para cada llamada al método que hacemos en ese grano de Singleton, (por ejemplo, cada vez que llamamos a poolConsumer.callPooledObjectMethod()
que a su vez llama a pooledObject.foo()
) nos obtener un nuevo bean PooledObject.
A continuación se presenta el código correspondiente:
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();
}
}
Esta respuesta no está actualizada, como dijo Christopher, desde Spring 3.0 el elemento ' ' es la forma correcta de hacerlo. Además, como señaló shrini1000, la inyección de método hace que la clase sea torpe para probar. –