Spring Boot AutoConfiguration - bean创建顺序

时间:2015-08-28 09:13:45

标签: java spring spring-boot

我有使用JPA的应用程序。

由于超出此问题的原因,我在单独的静态配置类中提供自定义JPAVendorAdapter。并且配置行为不确定。

当我启用--debug时,在我的Windows deksktop上,我看到了预期的结果:

  

JpaBaseConfiguration#jpaVendorAdapter          - @ConditionalOnMissingBean(types:org.springframework.orm.jpa.JpaVendorAdapter; SearchStrategy:all)   发现以下[customJPAVendorAdapter](OnBeanCondition)

但是,只要我将应用程序部署到某个服务器,我就会得到:

  

JpaBaseConfiguration#jpaVendorAdapter          - @ConditionalOnMissingBean(types:org.springframework.orm.jpa.JpaVendorAdapter; SearchStrategy:all)   找不到豆子(OnBeanCondition)

代码绝对一样。

请问有什么方法可以告诉我@Bean JPAVendorAdapter必须在JpaBaseConfiguration启动之前创建并自动配置默认适配器吗?

修改

配置相当普遍,但希望我将涵盖主要部分:

主要配置:

@ComponentScan(
        value = {"module.package"}
)
@EnableAutoConfiguration(exclude = {
        SecurityAutoConfiguration.
        DataSourceAutoConfiguration.class,
        HibernateJpaAutoConfiguration.class,
        JpaBaseConfiguration.class
    })
@EnableScheduling
@EnableConfigurationProperties
@Configuration
@Slf4j
public class MainConfig extends SpringBootServletInitializer implements SchedulingConfigurer {
 ...
}

使用JPA的模块:

@Configuration
@Slf4j
@Conditional(value = SelfHelpConfig.ModuleCondition.class)
@ComponentScan(basePackageClasses = SelfHelpModuleComponentScanPlaceholder.class)
public class SelfHelpConfig {

    public static class ModuleCondition extends AbstractModuleEnabledCondition {

        @Override
        public String getModuleId() {
            return "self-help";
        }
    }

    @Configuration
    @Conditional(value = SelfHelpConfig.ModuleCondition.class)
    static class JpaVendorConfig {

        @Bean
        public AbstractJpaVendorAdapter customJPAVendorAdapter(SpringHibernateJpaPersistenceProviderWithNamingStrategy jpaPersistenceProvider) {
            log.info("Creating custom JPA vendor adapter");

            return new HibernateJpaVendorAdapter() {
                @Override
                public PersistenceProvider getPersistenceProvider() {
                    return jpaPersistenceProvider;
                }
            };
        }
    }
}

此模块@ComponentScan发现数据库配置:

@Configuration
@EntityScan(basePackageClasses = SelfHelpModuleComponentScanPlaceholder.class)
@EnableJpaRepositories(basePackageClasses = SelfHelpModuleComponentScanPlaceholder.class)
@Import({DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class DBConfig {

}

如果JPAVendorConfig没有放在单独的类中,则根本不应用它。如果在单独的类中,则它可以在我的桌面上运行,但在部署到Linux服务器时则不行。

0 个答案:

没有答案