注解方法嵌套调用失效的问题

本贴最后更新于 863 天前,其中的信息可能已经时异事殊

1、问题

这次调试代码遇到一个奇怪的问题,我使用 dynamic datasource 进行多数据源配置,在 service 中建立了两个方法大致内容如下,即需要在 getDatabase0 中调用 getDatabase1 方法,然后查询 mySql1 的数据,但是查询后返回的值一直是 mySql0 这个库的数据。

    @DS("mySql0")
    public B_FertilizerSite getDatabase0(){
        return getDatabase1();
    }

    @DS("mySql1")
    public B_FertilizerSite getDatabase1(){
        return b_fertilizerSiteMapper.selectByPrimaryKey(1);
    }

2、处理

针对这个问题,可以通过代码改动来解决,如下:

    @DS("mySql0")
    public B_FertilizerSite getDatabase0(){
        return ((TestFertilizerSiteService)AopContext.currentProxy()).getDatabase1();
    }

    @DS("mySql1")
    public B_FertilizerSite getDatabase1(){
        return b_fertilizerSiteMapper.selectByPrimaryKey(1);
    }

同时在 Application 中添加

@EnableAspectJAutoProxy(exposeProxy = true)

3、原因

这是因为,我们调用 @DS 注解实际是产生一个代理对象,调用 getDatabase0 的时候,调用的是代理对象的 getDatabase0,但是代理对象的 getDatabase0 方法中,调用的是实际对象的 getDatabase1 方法,这里拿到代理对象(通过这个命令 AopContext.currentProxy()),让他调用代理对象的 getDatabase1 方法即可。

  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    941 引用 • 1458 回帖 • 151 关注
  • 开发
    37 引用 • 156 回帖 • 2 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3168 引用 • 8207 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...