我的应用程序中有多个DataSource。
使用@ConditionalOnSingleCandidate(DataSource.class)对标准org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration进行注释
我正在尝试以编程方式选择@Primary DataSource。
我已经尝试了一个BeanFactoryPostProcessor,它天真地选择了第一个DataSource并将其标记为主):
@Bean
public BeanFactoryPostProcessor beanFactoryPostProcessor() {
return this::setPrimaryDataSource;
}
public void setPrimaryDataSource(ConfigurableListableBeanFactory beanFactory) {
// Get all DataSource bean names
String[] dataSourceBeanNames = beanFactory.getBeanNamesForType(DataSource.class);
// Find primaryBeanName
String primaryBeanName = dataSourceBeanNames.length > 0 ? dataSourceBeanNames[0] : null;
// Return appropriate bean
assert primaryBeanName != null;
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(primaryBeanName);
beanDefinition.setPrimary(true);
LOGGER.info("Primary DataSource: {}", primaryBeanName);
}但是,这似乎不起作用- HibernateJpaConfiguration上的@ConditionalOnSingleCandidate(DataSource.class)检查仍然失败。
是否还有其他地方可以放置此代码,以便在检查@ConditionalOnSingleCandidate之前执行此代码
发布于 2020-08-29 18:11:09
如果您的代码位于带有@Configuration的类中,则该方法需要是静态的,以便在创建任何bean之前更新bean定义。
以下是PropertySourcesPlaceholderConfigurer的示例。
@Configuration
public class AppConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}您可以将@Bean方法声明为静态方法,允许在不将其包含的配置类创建为实例的情况下调用它们。这在定义后处理器bean(例如,类型为BeanFactoryPostProcessor或BeanPostProcessor)时特别有意义,因为这样的bean在容器生命周期的早期被初始化,并且应该避免在那时触发配置的其他部分。
发布于 2021-07-19 21:35:30
BeanFactoryPostProcessor为我工作:
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// logic to retrieve your bean name
String beanName = beanFactory.getBeanNamesForType(MyService.class)[0];
BeanDefinition bd = beanFactory.getBeanDefinition(beanName);
bd.setPrimary(true);
}
}https://stackoverflow.com/questions/63642104
复制相似问题