3.源码分析

服务引用的入口方法为 ReferenceBean 的 getObject 方法,该方法定义在 Spring 的 FactoryBean 接口中,ReferenceBean 实现了这个方法。实现代码如下:

  1. public Object getObject() throws Exception {
  2. return get();
  3. }
  4. public synchronized T get() {
  5. if (destroyed) {
  6. throw new IllegalStateException("Already destroyed!");
  7. }
  8. // 检测 ref 是否为空,为空则通过 init 方法创建
  9. if (ref == null) {
  10. // init 方法主要用于处理配置,以及调用 createProxy 生成代理类
  11. init();
  12. }
  13. return ref;
  14. }

以上两个方法的代码比较简短,并不难理解。这里需要特别说明一下,如果你对 2.6.4 及以下版本的 getObject 方法进行调试时,会碰到比较奇怪的的问题。这里假设你使用 IDEA,且保持了 IDEA 的默认配置。当你面调试到 get 方法的if (ref == null)时,你会发现 ref 不为空,导致你无法进入到 init 方法中继续调试。导致这个现象的原因是 Dubbo 框架本身有一些小问题。该问题已经在 pull request #2754 修复了此问题,并跟随 2.6.5 版本发布了。如果你正在学习 2.6.4 及以下版本,可通过修改 IDEA 配置规避这个问题。首先 IDEA 配置弹窗中搜索 toString,然后取消Enable 'toString' object view勾选。具体如下:

3.源码分析 - 图1