gpt4 book ai didi

java - Spring - 根据属性注入(inject)依赖

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:02:40 26 4
gpt4 key购买 nike

Spring Boot 是否有办法使用配置文件中提供的类名和构造函数属性注入(inject)依赖项?

例如,我有两个版本的通用接口(interface),IFileStoreFileStoreAFileStoreB。我希望能够在 application.yml 文件中定义我应该使用其中的哪些。

我知道我可以做这样的事情:

@Value("${fileStore.class}")
private String fileStoreClassName;

@Bean
public IFileStore fileStore() {
switch(fileStoreClassName) {
case "FileStoreA":
return new FileStoreA();
case "FileStoreB":
return new FileStoreB();
}
}

然而,这感觉真的很糟糕。我还必须手动提取并向它们提供任何必需的参数。

我的理想是它能够根据类名确定使用哪个,并提供特定需要的任何参数,所以如果我添加第三个 FileStore,它会自动-神奇地工作,我只需要用它来代替类名。

最佳答案

如果你真的只需要一个bean,那么创建一个条件配置

@Configuration
@ConditionalOnProperty(name = "fileStore.class", havingValue="FileStoreA")
public class FileStoreAConfiguration {
@Bean
public IFileStore fileStore() {
return new FileStoreA(...);
}
}

@Configuration
@ConditionalOnProperty(name = "fileStore.class", havingValue="FileStoreB")
public class FileStoreBConfiguration {
@Bean
public IFileStore fileStore() {
return new FileStoreB(...);
}
}

实际上比这更容易,因为注解可以用在方法上,而不是有单独的配置类。

参见 ConditionalOnProperty Javadoc

关于java - Spring - 根据属性注入(inject)依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46771454/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com