微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于高版本ShardingSphere,5.1.x版本ShardingSphereDataSource类是final类型的代理

使用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依然存在代理问题,但是如果是直接拿来使用的话完全无影响。

原文地址:https://www.jb51.cc/wenti/3285723.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐