【发布时间】: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