考虑这个例子

我有界面

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=truefsclient应该是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();
        }
    }
}

10-07 15:22