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