Spring - 基于属性注入依赖关系

时间:2017-10-16 13:24:26

标签: java spring spring-boot

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();
    }
}

然而,这感觉非常黑客。我还必须手动提取并提供任何所需的参数。

我的理想是,它能够根据班级名称确定使用哪个,并且还提供特定人员需要的任何参数,因此如果我添加第三个FileStore,那么&#39 ; d自动神奇地工作,我只需要用它来代替类名。

3 个答案:

答案 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(...);
    }
}

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

请参阅ConditionalOnProperty Javadoc

答案 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>