我不太确定应该使用构造函数注入还是字段注入。我觉得我应该进行字段注入,但这让我想知道如何确定使用哪种实现的正确方法。
我创建了一个接口,我认为它是一个存储库:
public interface Repository {
public Map<String, String> loadData(InputStream file, FileProperties fileProperties);
public String getData(String filename);
}
在我的 RestController 中,我想检查一个环境变量以查看我将使用该接口的哪个实现。
我注意到我可以使用两个实现进行构造函数注入,这会让我得到这样的结果:
@RestController
@RequestMapping("/api/files")
public class RespositoryAPI {
private Repository repository;
private final String MODE_TYPE = System.getenv(ENV_MODE);
public RepositoryAPI(RepoImplA a, RepoImplB b) {
if (MODE_TYPE == "A") {
repository = a;
}
...
}
@PostMapping
public Map<String, String> uploadFile(@RequestPart("file") MultipartFile file, @RequestPart("properties") FileProperties properties) {
return repository.loadData(file.getInputStream(), properties);
}
}
基本上随着新的可行实现的出现,我想我需要像这样将它们添加到构造函数中:
public RepositoryAPI(ImplA a, ImplB b, ImplC c, ...)
我理解的另一种方法是像这样使用 Spring @Autowired:
@Autowired
private RepoImplA a;
@Autowired
private RepoImplB b;
如果我这样做,我不知道根据该环境变量决定实际使用哪一个实现的好方法。
也许我让这比它需要的更复杂一些。解决此问题的正确方法是什么?