2017-10-16 29 views
3

春天在什么引导进样依赖有办法注入与在配置文件中提供的类名和构造性的依赖?春 - 基于性能

例如,我有两个版本的通用接口,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,它会自动神奇的工作和我” d只需将其用于班级名称。

+0

当你说“这是能够确定哪些基于类的名称使用”。它是什么'?你是否自动连线这些物件?你如何使用FileStore? – robjwilkins

+0

是的。基本上我的实际需要直接使用它的类倒是'@Autowired IFileStore fileStore',不管底层的实现。这个例子'FileStore'只是有三个功能:'得到()','保存()'和'有()'基本“文件”的访问(不一定是在文件系统上的实际文件)。 – samanime

回答

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

+0

这看起来很有希望。谢谢。 – samanime

2

您可以以配置相同@Bean但不同的实现方式使用Spring配置文件(@Profile注释)。

例如,你可以做一个生产配置是这样的:

@Configuration 
@Profile("production") 
public class ProductionConfiguration { 

    // ... 

} 

所以,你的榜样,你可以配置你有多少个配置文件要求,然后你可以在任何通常的方式指定属性例如,您可以将其包含在您的application.properties中。

对于进一步的细节,你可以阅读Spring Boot features - Profiles

+0

有没有一种方法能有这个涓滴,那种“application.yml”怎么滑下到“应用prod.yml”?我们有相当多的环境,但只有2个不同的配置文件。每个人都有一份简介会是一堆工作。 – samanime

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>