簡體   English   中英

Spring - 基於屬性注入依賴關系

[英]Spring - Inject Dependency based on properties

Spring Boot是否有辦法使用配置文件中提供的類名和構造函數屬性注入依賴項?

例如,我有兩個版本的通用接口, 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();
    }
}

然而,這感覺非常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(...);
    }
}

它實際上比這更容易,因為注釋可以用在方法上,而不是具有單獨的配置類。

請參閱ConditionalOnProperty Javadoc

您可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM