Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在启动时以编程方式将Springbean标记为@Primary?_Java_Spring_Hibernate - Fatal编程技术网

Java 如何在启动时以编程方式将Springbean标记为@Primary?

Java 如何在启动时以编程方式将Springbean标记为@Primary?,java,spring,hibernate,Java,Spring,Hibernate,我的应用程序中有多个数据源 标准的org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration用@ConditionalOnSingleCandidate(DataSource.class) 我正试图以编程方式选择一个@Primary数据源 我尝试了一个BeanFactoryPostProcessor,它天真地选择第一个数据源并将其标记为主数据源): 但是,这似乎不起作用-检查hibernatejpacConfi

我的应用程序中有多个
数据源

标准的
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration
@ConditionalOnSingleCandidate(DataSource.class)

我正试图以编程方式选择一个
@Primary
数据源

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

但是,这似乎不起作用-检查
hibernatejpacConfiguration
上的
@conditionalOnSingle候选者(DataSource.class)
仍然失败


是否还有其他地方可以放置此代码,以便在检查
@ConditionalOnSingleCandidate
之前执行此代码?

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

以下是PropertySourcesPlaceholderConfigurer的示例

@Configuration
public class AppConfig {

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

}
在:

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


Hi@Cyril G.,这当然会使方法在生命周期的早期执行,但仍然无法通过
@ConditionalOnSingleCandidate
检查。如果您有多个数据源,您需要自己为每个数据源定义一个JPA配置。这可能有助于您配置多个数据源:这篇文章专门使用了
@Primary
注释,我知道这一点。问题不在于配置多个数据源——这很简单。问题是根据可用性动态选择
@Primary
数据源。
@Configuration
public class AppConfig {

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

}