使用YmlFactory或者是直接注入的,或者是其他方式创建的ShardingSphereDataSource由于这个类是被final修饰的,不能使用cglib进行代理,要不然会报错,这里有两种解法。
报错信息:
Caused by: java.lang.IllegalArgumentException:Cannot subclass final class org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereSource
第一,设置成final的,直接生成一个static类型的类级变量用来存放创建后的ShardingSphereDataSource,这样既可,因为static是全局唯一的,在接下来创建sqlSessionFactory或者事务的时候可以用。
第二,修改ShardingSphereDataSource类名,重新注册,但是这里会有个当前使用的代理问题可设置成
@Scope(proxyMode = ScopedProxyMode.INTERFACES)
或者yml中直接设置
proxy-target-class:false
如下:
@Configuration public class ShardingDataSourceConfig implements BeanDeFinitionRegistryPostProcessor { @Override public void postProcessBeanDeFinitionRegistry(BeanDeFinitionRegistry registry) throws BeansException { String className=ShardingSphereDataSource.class.getName(); String beanName="shardingSphereDataSource"; if (registry.containsBeanDeFinition(beanName)){ BeanDeFinition beanDeFinition = registry.getBeanDeFinition(beanName); registry.removeBeanDeFinition(beanName); registry.registerBeanDeFinition(className+ AutowireCapablebeanfactory.ORIGINAL_INSTANCE_SUFFIX,beanDeFinition); return; } } @Override public void postProcessbeanfactory(ConfigurableListablebeanfactory configurableListablebeanfactory) throws BeansException { }
第三,使用ShardingSphere的starter模式,直接注入DataSource,然后使用,这时其实是使用的spring自动加载逻辑,这里的DataSource就是ShardingSphereDataSource。开箱即食,但是这里的DataSource依然存在代理问题,但是如果是直接拿来使用的话完全无影响。