[英]Spring - Inject Dependency based on properties
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();
}
}
然而,這感覺非常hacky。 我還必須手動提取並提供任何所需的參數。
我的理想是它能夠根據類名確定使用哪個,並且還提供特定需要的任何參數,所以如果我添加第三個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(...);
}
}
它實際上比這更容易,因為注釋可以用在方法上,而不是具有單獨的配置類。
您可以使用Spring Profiles( @Profile
注釋)來配置相同的@Bean但具有不同的實現。
例如,您可以制作如下的生產配置:
@Configuration
@Profile("production")
public class ProductionConfiguration {
// ...
}
因此,對於您的示例,您可以配置所需的配置文件數量,然后您可以通過任何常用方式指定屬性,例如,您可以將其包含在application.properties
。
有關更多詳細信息,您可以閱讀Spring Boot功能 - 配置文件
您是在尋找基於XML的配置嗎?
<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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.