考虑这个例子
我有界面
interface FSClient
String getMeData()
和实现它的类
class MockFSClient implements FSClient {
public String getMeData() {
return “I am mock”;
}
}
class RestFSClient implements FSClient {
public String getMeData() {
final String data = // from web service
return data;
}
}
和一个看起来像的经理
class FSManager {
private FSClient fsclient;
@Autowired
public void FSManager(@Nonnull final FSClient fsClient) {
this.fsclient = fsClient;
}
}
我想基于系统属性实例化
fsclient
com.fs.mock=true
表示如果
com.fs.mock=true
,fsclient
应该是MockFSClient
否则fsClient
应该是RestFSClient
我怎样才能做到这一点?
我为什么需要它?
这样我就可以解耦并进行测试
请帮忙,我是Spring的新手
最佳答案
您是否在问如何获取com.fs.mock
的值,因为答案是使用@Value
批注和PropertyPlaceholderConfigurer bean。
如果您要问如何创建实际对象,请按照@Jakkra的说明,使用包含围绕com.fs.mock
值的if语句的工厂。它不是最优雅的解决方案,但是可以工作。
例
public class ClientFactory {
@Value("${com.fs.mock}")
private boolean mockFlag;
public static returnClientInstance(){
if(mockFlag){
return new MockFSClient();
}
else{
return new RestFSClient();
}
}
}