Spring Boot是否有办法使用配置文件中提供的类名和构造函数属性注入依赖项?
例如,我有两个版本的通用界面,IFileStore
,FileStoreA
和FileStoreB
。我希望能够在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
,那么&#39 ; d自动神奇地工作,我只需要用它来代替类名。
答案 0 :(得分:3)
如果您真的只需要一个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(...);
}
}
它实际上比这更容易,因为注释可以用在方法上,而不是具有单独的配置类。
答案 1 :(得分:2)
您可以使用Spring Profiles(@Profile
注释)来配置相同的@Bean但具有不同的实现。
例如,您可以制作如下的生产配置:
@Configuration
@Profile("production")
public class ProductionConfiguration {
// ...
}
因此,对于您的示例,您可以配置所需的配置文件数量,然后您可以通过任何常用方式指定该属性,例如,您可以将其包含在application.properties
中。
有关详细信息,请参阅Spring Boot features - Profiles
答案 2 :(得分:0)
您是否正在寻找XML-based configuration?
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="fileStore" class="com.example.FileStoreA">
<property name="parameter1" value="Hello World!"/>
</bean>
</beans>