を見てみましょう(個人的に、私は...そこにある疑問)あなたが実装するサブクラスを作成する必要があります(ユニットテストに困難シングルトン-Beanクラスを作ります依存関係を出す方法)。さらに、インスタンスを直接インスタンス化できないため、再利用が容易ではないため、Springを使用していない場合にこのクラスを使用する場合は、Beanを返すメソッドをサブクラス化して提供する必要があります。
より良いアプローチIMHOは、次のように、プロキシ、プロトタイプターゲットソース、およびプロトタイプターゲットビーンを使用することです。このようなシングルトンBeanクラスは、単体テストが容易で、再利用が容易です。
<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>
(上図のように
poolConsumer
)今
私たちはシングルトンBeanにpooledObject
を注入することができ、私たちはそのシングルトンBeanで作るすべてのメソッド呼び出し、(私たちは順番にpooledObject.foo()
を呼び出しpoolConsumer.callPooledObjectMethod()
呼び出すなど、すべての時間)のために、私たち新しいPooledObject beanを取得します。
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();
}
}
この回答はChristopher氏によると、Spring 3.0では ' '要素が正しい方法であるため、古くなっています。また、shrini1000によって指摘されているように、メソッドインジェクションはクラスを不器用にしてテストします。 –