Spring依赖注入接口

时间:2021-04-01 00:24:05

标签: java spring spring-boot

我不太确定应该使用构造函数注入还是字段注入。我觉得我应该进行字段注入,但这让我想知道如何确定使用哪种实现的正确方法。

我创建了一个接口,我认为它是一个存储库:

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;

如果我这样做,我不知道根据该环境变量决定实际使用哪一个实现的好方法。

也许我让这比它需要的更复杂一些。解决此问题的正确方法是什么?

0 个答案:

没有答案