首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在启动时以编程方式将spring bean标记为@Primary?

如何在启动时以编程方式将spring bean标记为@Primary?
EN

Stack Overflow用户
提问于 2020-08-29 07:46:41
回答 2查看 492关注 0票数 3

我的应用程序中有多个DataSource

使用@ConditionalOnSingleCandidate(DataSource.class)对标准org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration进行注释

我正在尝试以编程方式选择@Primary DataSource

我已经尝试了一个BeanFactoryPostProcessor,它天真地选择了第一个DataSource并将其标记为主):

代码语言:javascript
运行
复制
    @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之前执行此代码

EN

回答 2

Stack Overflow用户

发布于 2020-08-29 18:11:09

如果您的代码位于带有@Configuration的类中,则该方法需要是静态的,以便在创建任何bean之前更新bean定义。

以下是PropertySourcesPlaceholderConfigurer的示例。

代码语言:javascript
运行
复制
@Configuration
public class AppConfig {

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
         return new PropertySourcesPlaceholderConfigurer();
    }

}

documentation

您可以将@Bean方法声明为静态方法,允许在不将其包含的配置类创建为实例的情况下调用它们。这在定义后处理器bean(例如,类型为BeanFactoryPostProcessor或BeanPostProcessor)时特别有意义,因为这样的bean在容器生命周期的早期被初始化,并且应该避免在那时触发配置的其他部分。

票数 1
EN

Stack Overflow用户

发布于 2021-07-19 21:35:30

BeanFactoryPostProcessor为我工作:

代码语言:javascript
运行
复制
@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);
    }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63642104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档