使定义的spring bean成为主要的

时间:2017-11-02 20:59:36

标签: java spring spring-boot

我在spring.xml中定义了3个相同类型的bean。这是一个我无法编辑的jar文件。我想在我的spring-boot应用程序中使用注释创建其中一个主要版本。有办法吗?

3 个答案:

答案 0 :(得分:2)

您可以使用@Qualifier("___beanName__")注释来选择正确的

答案 1 :(得分:2)

一种简单的方法是使用桥接配置,它将所需的bean注册为新的主bean。一个简单的例子:

界面:

public interface Greeter { String greet(); }

您无法控制的配置:

@Configuration
public class Config1 {
    @Bean public Greeter british(){ return () -> "Hi"; }
    @Bean public Greeter obiWan(){ return () -> "Hello there"; }
    @Bean public Greeter american(){ return () -> "Howdy"; }
}

网桥配置:

@Configuration
public class Config2 {
    @Primary @Bean public Greeter primary(@Qualifier("obiWan") Greeter g) { 
        return g; 
    }
}

客户端代码:

@RestController
public class ControllerImpl {
    @Autowired
    Greeter greeter;

    @RequestMapping(path = "/test", method = RequestMethod.GET)
    public String test() {
        return greeter.greet();
    }
}

curl http://localhost:8080/test的结果将是

Hello there

答案 2 :(得分:0)

我尝试了@jihor解决方案,但是没有用。我在定义的配置中有一个NullPointerException

然后我在Spring Boot上找到了下一个解决方案

@Configuration
public class Config1 {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.ddbb")
    public JndiPropertyHolder ddbbProperties() {
        return new JndiPropertyHolder();
    }

    @ConditionalOnProperty(name = "spring.datasource.ddbb.primary", matchIfMissing = false, havingValue = "true")
    @Bean("ddbbDataSource")
    @Primary
    public DataSource ddbbDataSourcePrimary() {
        return new JndiDataSourceLookup().getDataSource(ddbbProperties().getJndiName());
    }

    @ConditionalOnProperty(name = "spring.datasource.ddbb.primary", matchIfMissing = true, havingValue = "false")
    @Bean("ddbbDataSource")
    public DataSource ddbbDataSource() {
        return new JndiDataSourceLookup().getDataSource(ddbbProperties().getJndiName());
    }
}

还有我的 application.properties ,如果我需要将此数据源作为主要数据源,则不要设置该属性或将其设置为false。

spring.datasource.ddbb.primary=true