【问题标题】:Spring Boot datasource doesn't go to BeanPostProcessorSpring Boot 数据源不去 BeanPostProcessor
【发布时间】:2019-02-12 17:00:50
【问题描述】:

我正在尝试为我的数据源创建代理,但从未使用 bean 数据源对象调用以下内容,并且 bean instanceof DataSource 始终为 false

@Component
public class DatasourceProxyBeanPostProcessor implements 
BeanPostProcessor {

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) {
        if (bean instanceof DataSource) {
            final ProxyFactory factory = new ProxyFactory(bean);
            factory.setProxyTargetClass(true);
            factory.addAdvice(new ProxyDataSourceInterceptor((DataSource) bean));
            return factory.getProxy();
        }
        return bean;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) {
        return bean;
    }
}

我对 postgres 有以下配置:

spring:
  datasource:
    username: ***
    password: ***
    url: jdbc:postgresql://localhost:5432/postgres?currentSchema=myschema

Spring Boot:v1.5.x

知道为什么我没有进入块 bean instanceof DataSource 吗?

【问题讨论】:

  • 当您调用 postProcessAfterInitialization(Object bean, String beanName) 时,您能说出变量“bean”的含义吗?是空的吗?
  • 我有大量的豆子。 Spring 为每个 bean 调用 postProcessAfterInitialization。所以,它不是空的。问题是它没有被适合“bean instanceof DataSource”的bean调用
  • 所以很明显你的 DataSource bean 不存在于 spring 上下文中。即使您传递了配置,您是否在应用程序中初始化了任何 DataSource bean?像@Autowired private JdbcTemplate jdbcTemplate;如果不是,我认为是问题所在,即使您提供了配置,也没有这样的 bean。
  • @Damith,我没有直接初始化任何数据源。我只做了 yaml 配置。我使用 EntityManager 处理我的数据库,并且在该配置下工作正常。
  • 就是这样。由于您只是在初始化配置,因此您的 spring 上下文没有 DataSource 实现的 bean。当然,在您提供配置时,它确实具有 DataSourceProperties bean。这样您就可以与实体经理合作。但是如果你想拥有这个逻辑,你必须初始化一个 DataSource 实现的 bean。 docs.spring.io/autorepo/docs/spring-framework/3.2.8.RELEASE/…

标签: java spring hibernate spring-boot spring-data


【解决方案1】:

你见过DelegatingDataSource吗?

我们或许可以用代理解决你的问题,但这个课程可能是为了解决你的根本问题:

这个类应该是子类,子类只覆盖 那些不应该简单的方法(例如getConnection()) 委托给目标数据源。

【讨论】:

  • 当我创建这样一个 bean 时,我得到:创建名称为“delegatingDataSource”的 bean 时出错:当前正在创建请求的 bean:是否存在无法解析的循环引用?
  • 如果您想沿着这条路线寻求解决方案,我会发布您的配置。如果您正在注入 DS 并且您的上下文中唯一的一个是委托 DS,则您可能已经进行了循环引用
  • 是的,请发帖
  • 我的意思是请发布您的配置
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
  • 2014-06-28
  • 2017-05-15
相关资源
最近更新 更多