java - 用两种可能的实现定义 bean

标签 java spring spring-boot javabeans

到目前为止,我有一个非常简单的 bean 定义,如下所示:

@Bean
@Conditional(value=ConditionClass.class)
SomeInterface myMethodImpl(){
    return new ImplementationOne();
}

但是,我现在遇到的情况是添加了额外的实现类,我们称它为 ImplementationTwo,当在配置文件。

所以我需要的是这样的:

@Bean
@Conditional(value=ConditionClass.class)
SomeInterface myMethodImpl(){
    return context.getEnvironment().getProperty("optionEnabled") ? new 
   ImplementationOne() : new ImplementationTwo();
}

基本上是一种在 bean 定义时根据配置值实例化正确实现的方法。这可能吗,任何人都可以提供一个例子吗?谢谢

最佳答案

无需使用 @Conditional 即可实现。

假设您有一个接口(interface) SomeInterface 和两个实现 ImplOne ImplTwo:

SomeInterface.java

public interface SomeInterface {
    void someMethod();
}

ImplOne.java

public class ImplOne implements SomeInterface{
    @Override
    public void someMethod() {
       // do something
    }
}

ImplTwo.java

public class ImplTwo implements SomeInterface{
    @Override
    public void someMethod() {
       // do something else
    }
}

然后你可以像这样在配置类中控制使用哪个实现:

MyConfig.java

@Configuration
public class MyConfig {

    @Autowired
    private ApplicationContext context;

    @Bean
    public SomeInterface someInterface() {
        if (this.context.getEnvironment().getProperty("implementation") != null) {
            return new ImplementationOne();
        } else {
            return new ImplementationTwo();
        }
    }
}

确保spring的组件扫描找到MyConfig。然后,您可以使用 @Autowired 将正确的实现注入(inject)代码中的其他任何位置。

关于java - 用两种可能的实现定义 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52949694/

相关文章:

java - 缩放后getWidth不返回不同的值

java - 如何在 spring 数据 jpa 规范中将枚举作为字符串处理

java - 返回节点列表 Java-Parent 中的树可以有多个子节点

java - 未调用 Spring Security 过滤器

java - spring boot Controller 可以接收纯文本吗?

java - 查询 DSL + Spring Data JPA 中的 Group by 抛出 NoSuchElementException

java - Apache Solr 查询计算价格中位数

spring - 带有 spring-data solr 的嵌套文档

java - Java Spring 中的辅助类

gradle - Spring Maven Repo和Spring Boot 1.4.x的潜在问题