【问题标题】:How inject DataSource(HikariCP) in Auto Configuration class?如何在 Auto Configuration 类中注入 DataSource(HikariCP)?
【发布时间】:2019-03-21 13:29:03
【问题描述】:

我正在尝试使用Spring Boot 2 + Spring Data + Custom Auto Configuration Classes,但由于某种原因无法在第三类中注入DataSource(由HikariCP 提供)。

@Configuration
@AutoConfigureOrder(Ordered.LOWEST_PRECEDENCE)
public class InitialAutoConfiguration {
 //Beans to load in theory first.
}


@Configuration
@AutoConfigureOrder(Ordered.LOWEST_PRECEDENCE)
@AutoConfigureAfter(InitialAutoConfiguration.class)
@EntityScan(basePackageClasses = Asset.class)
@EnableJpaRepositories(basePackageClasses = AssetRepository.class,
    repositoryBaseClass = BaseRepositoryImpl.class,
    repositoryFactoryBeanClass = ExtendedJpaRepositoryFactoryBean.class)
public class JpaAutoConfiguration { //Load Jpa Classes
}


@Configuration
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@AutoConfigureAfter(JpaAutoConfiguration.class)
@ComponentScan(basePackages = {"com.xxx"})
public class ServiceConfiguration {
    @Inject
    private DataSource dataSource; //Datasource is null

    @Bean
    public DbPropertySourcesPlaceholderConfigurer dbPropertySourcesPlaceholderConfigurer() {
    DbPropertySourcesPlaceholderConfigurer placeholderConfigurer = new DbPropertySourcesPlaceholderConfigurer(dataSource);
    placeholderConfigurer.setPlaceholderPrefix("%{");
    placeholderConfigurer.setPlaceholderSuffix("}");
    return placeholderConfigurer;
    }
}

META-INF/spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.xetec.autoconfigure.InitialAutoConfiguration,\
  com.xetec.autoconfigure.JpaAutoConfiguration,\
  com.xetec.autoconfigure.ServiceConfiguration

看起来我的类在 Spring Data Classes(DataSourceAutoConfiguration.Hikari) 之前加载。

有没有一种方法可以先加载 Spring Boot Starters Classes,然后再加载我的自定义类?

谢谢

【问题讨论】:

    标签: spring-boot spring-data hikaricp


    【解决方案1】:

    您对最高和最低优先级的使用是错误的。您的ServiceConfiguration 以最高优先级排序,这意味着它将首先被评估。

    我不会使用绝对排序,而是使用@AutoConfigureAfter(DataSourceAutoConfiguration.class)

    【讨论】:

    • 嗨 @Andy 尝试使用 @AutoConfigureAfter(DataSourceAutoConfiguration.class), @DependsOn("dataSource") 和 spring.factories org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration 但都不起作用,DataSource 始终为空。使用@DependsOn 时,调用DataSourceConfiguration.Hikari.dataSource 中的方法,但未绑定DatasourceProperties 则抛出异常DataSourceBeanCreationException: Failed to determine a suitable driver class
    • 你不应该在你的 spring.factories 中列出 Boot 自己的自动配置。它已在自己的文件中列出。
    • @AndyWilkinson 如果DbPropertySourcesPlaceholderConfigurer是一个BeanFactoryPostProcessor,这个bean的创建方法会很早就导致ServiceConfiguration实例化,所以那个时候DataSource为null
    • 好点,@clevertension。我忽略了DbPropertySourcesPlaceholderConfigurer 大概是BeanFactoryPostProcessor。应避免将任何内容注入BeanFactoryPostProcessor,因为在应用程序上下文的生命周期的早期就需要这样做。
    【解决方案2】:

    我不确定以下更改是否可以解决您的问题,但我遇到了类似的问题

    在您的方法中添加 静态

    @Bean
        public static DbPropertySourcesPlaceholderConfigurer dbPropertySourcesPlaceholderConfigurer() {
    ....
    }
    

    【讨论】:

      猜你喜欢
      • 2014-07-01
      • 2018-01-03
      • 2011-11-16
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-23
      相关资源
      最近更新 更多