baomidou / dynamic-datasource

dynamic datasource for springboot 多数据源 动态数据源 主从分离 读写分离 分布式事务
https://www.kancloud.cn/tracy5546/dynamic-datasource/2264611
Apache License 2.0
4.74k stars 1.19k forks source link

DynamicDataSourceAnnotationAdvisor无法拦截到jar包中的@DS注解 #646

Closed Rushing0711 closed 5 months ago

Rushing0711 commented 5 months ago

Please fill it out carefully, or it will be closed. 请认真填写,不然会直接关闭。

Enviroment

JDK Version(required): 1.8

SpringBoot Version(required): 2.4.11

dynamic-datasource-spring-boot-starter Version(required): 3.5.2

druid Version(optional): 1.1.22

Describe what happened

我项目中有一个SysService,标注了@DS("common"),然后把这个类封装到jar包了。 我的业务系统引入了这个jar,启动后调用SysService发现并不能代理到对应数据源上。 初步排查,发现DynamicDataSourceAnnotationAdvisor并未被执行,进一步排查AbstractAdvisorAutoProxyCreator#findEligibleAdvisors方法,发现对SysService执行后,把这个Advisor过滤掉了,原因是Advisor也是一个isCurrentlyInCreation的bean。更细的原因没能找到,感觉和服务加载有关系。

然后,我又添加一个jar,这个jar中被拦截到了,但之前的jar还是不行。 我的SysService是通过@ComponentScan扫描的,两个jar都是这样的。 尝试过@AutoConfigureOrder和@AutoConfigureAfter(DynamicDataSourceAutoConfiguration.class),也是无效的。

Expected Result: 期望2个jar中的服务,标注了@DS都能被拦截到,能切换数据源。

Actual Result: 一个jar能成功,另外一个jar未能被拦截到。两个jar都是在一个@Configuration的类上使用了@ComponentScan加载对应包的服务的。

If there is an exception,or aop invalid,please attach the exception trace:

Just paste your stack trace here!

Steps to reproduce

huayanYu commented 5 months ago

这种问题我估计只有等待非常熟悉AOP完整机制的人才可能回答你