我有一个Spring Boot应用程序,并希望根据底层SQL数据源的类型(使用spring.datasource.*属性定义)注入特定的存储库实现.我试图在这里使用自定义条件,但不幸的是,当它被评估时,我无法获取数据源以检查数据库类型.我的...
![](https://oss.womengda.net/imgfile/2310/1ER05c5212F-1ZM.jpg)
我有一个Spring Boot应用程序,并希望根据底层SQL数据源的类型(使用spring.datasource.*属性定义)注入特定的存储库实现.
我试图在这里使用自定义条件,但不幸的是,当它被评估时,我无法获取数据源以检查数据库类型.
我的情况目前看起来像这样:
@Order(Ordered.LOWEST_PRECEDENCE - 10)
class OnDatabaseTypeCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
DataSource dataSource = context.getBeanFactory().getBean(DataSource.class);
// further matching code here
}
它应该使用这样的东西:
@ConditionalOnDatabaseType(H2)
public class MyCustomImplementation implements MyRepository {
// Code
}
但是,在评估条件时,我得到一个未定义数据源的异常:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.sql.DataSource] is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:348)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:335)
我假设发生了这种情况,因为在构造所有bean之前已经检查了条件.有什么办法可以告诉Spring在评估这个条件之前必须创建数据源吗?或者使用Spring条件这是不可能的?
我想通过以下方式解决的用例如下:应用程序可以使用不同类型的数据库运行,而某些(如H2)不具有某些功能,如窗口函数.所以我想为某些可能较慢但功能正常的数据库提供特殊查询.这种方法的想法是,这些JDBC存储库应该易于标记,而无需引入特定的Spring配置文件,而只需查看底层数据库(使用org.springframework.jdbc.support.JdbcUtils).
谢谢
解决方法:
实际创建bean时会评估某些条件.如果要检查是否存在bean,则需要非常小心,因为在该阶段获取bean的任何尝试都将导致早期初始化.这是第一个问题.
第二个问题是您的配置(应用程序配置)始终在自动配置之前完全运行.如果Spring Boot必须决定是否必须创建一个DataSource,它应该为应用程序配置提供一个机会.
您可以实现的唯一方法是通过自动配置,确保您的自动配置在应该提供您正在寻找的bean之后运行(@AutoconfigureAfter).无论我不打算直接调用这样的上下文.检查OnBeanCondition以了解Spring Boot如何做这件事.因此,您无法在应用配置或组件扫描扫描的组件中添加此类条件.
话虽如此,用例看起来很奇怪.也许我们可以退后一步,你可以解释为什么你需要这样做.
本文标题为:java – Spring Boot:数据库类型的条件
![](/xwassets/images/pre.png)
![](/xwassets/images/next.png)
- 解决swagger2中@ApiResponse的response不起作用 2023-01-02
- Java番外杂谈之每天扫的二维码你了解它内含的信息吗 2022-10-24
- SpringBoot结合JWT实现用户登录、注册、鉴权 2023-07-15
- Java日期时间类(Date、DateFormat、Calendar)解析 2023-01-08
- Go Java算法之字符串中第一个唯一字符详解 2022-09-03
- java线程组构造方法源码解析 2023-04-18
- IDEA 中使用 Hudi的示例代码 2023-01-02
- Springboot详解RocketMQ实现消息发送与接收流程 2023-01-29
- Java实现字符串的分割(基于String.split()方法) 2023-06-06
- SpringMVC如何用Post方式重定向 2023-06-23