Sử dụng tiêm phương pháp làm cho các lớp singleton-đậu khó khăn cho đơn vị kiểm tra (bạn cần phải tạo một lớp con để thực hiện phương pháp đưa ra sự phụ thuộc). Thêm vào đó nó không thể tái sử dụng được vì bạn không thể trực tiếp khởi tạo nó, vì vậy nếu bạn không sử dụng Spring và muốn sử dụng lớp này, bạn sẽ cần phải phân lớp và cung cấp phương thức trả về bean.
Một cách tiếp cận tốt hơn IMHO là sử dụng một proxy, một nguồn mục tiêu mẫu thử nghiệm và một bean đích mẫu thử nghiệm, như sau. Lớp đơn lớp đậu như vậy dễ dàng kiểm tra đơn vị và có thể tái sử dụng tốt hơn.
<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>
Bây giờ chúng ta có thể tiêm pooledObject
vào một bean singleton (poolConsumer
như trình bày ở trên), và cho mỗi cuộc gọi phương pháp mà chúng tôi thực hiện trên đó đậu singleton, (ví dụ như mỗi lần chúng tôi gọi poolConsumer.callPooledObjectMethod()
nó sẽ gọi pooledObject.foo()
), chúng tôi có được một bean PooledObject mới.
Tiếp theo là các mã tương ứng:
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();
}
}
Câu trả lời này đã lỗi thời, như Christopher đã nói, từ mùa xuân 3.0, phần tử ' ' là đúng cách để làm điều đó. Ngoài ra, như chỉ ra bởi shrini1000, phương pháp tiêm làm cho lớp vụng về để kiểm tra. –