美文网首页Java
Druid中的依赖注入——Guice

Druid中的依赖注入——Guice

作者: RantLing | 来源:发表于2019-12-08 19:52 被阅读0次

前言:作为一个大型的开源项目,其设计模式,代码架构和设计理念中必然有值得我们学习和了解的内容。同时作为一个成千上万开源contributor参与的开源项目,其代码风格和编程习惯上肯定有会有所差异。分析这样的项目,必然要从宏观上了解其代码逻辑的基本流程,从细微处学习其常用的模式和编程方法。今天就看看Druid是如何将Guice依赖注入运用在自己的代码中,又为什么要这样去实现?

我们以CliMiddleManager为入口,这个类比较简单只有一个从写的方法——getModules,返回Guice的配置信息。这个在之前的Guice文章中有说过它的作用,这里不再说明。那么这个getModules又是如何被使用的呢?其实这个方法是在它的父类GuiceRunnable中声明的

image.png
从上图我们可以看到,其实Druid的每个服务继承了这个抽象类。
这里实际上是用到了一个模板方法模式——父类定义算法流程,算法的实现细节由子类决定。在父类GuiceRunnablemakeInjector方法中会使用到这个getModules方法返回的modules来创建一个injector。而具体的绑定配置则可以通过子类实现的getModules来进行配置。在这个方法中,每个服务都会将使用到的一些变量,依赖的其他类进行配置。
下面是makeInjector方法的具体实现
 public Injector makeInjector()
  {
    try {
      return Initialization.makeInjectorWithModules(
          baseInjector, getModules()
      );
    }
    catch (Exception e) {
      throw Throwables.propagate(e);
    }
  }

这样一来,就通过客户端的方法重写,完成了指定配置。
Guice的一般使用步骤是:

1. 定义接口;
2. 实现接口;
3. 继承Module完成注入配置;
4. 创建Injector对象;
5. 注入实现类或者变量等。  

上面的流程实际上已经完成了1~4,接下来我们在看看它是在什么地方进行注入的。
在上面的分析中,我们知道这几个类的顶级父类是Runnable,按照面向接口编程的思维,在后面是会调用run方法的,而run方法是在ServerRnnable中实现的,我们看一下其具体的逻辑:

   public void run()
  {
    final Injector injector = makeInjector();
    final Lifecycle lifecycle = initLifecycle(injector);

    try {
      lifecycle.join();
    }
    catch (Exception e) {
      throw Throwables.propagate(e);
    }
  }
}

我们可以看到,创建出来的Injector方法主要是被initLifecycle这个方法使用了。在这个方法中,上面的配置会被用来创建一个LifeCycle对象,通过这个对象来完成middleManger服务的启动。
其实在这里我是有个疑问的,我们先看看这个三个类之间的关系:

image.png
我的问题就是,为什么要重新定义一个ServerRunnable类来重写run方法,而不是在GuiceRunnable类或者CliMiddleManager类中重写。然后,我看了一下类的继承关系,发现了GuiceRunnable还被其他的一些类继承了,而他们run的实现逻辑是不同的,所以是不能在父类中是实现。
image.png
至于为什么不在CliMiddleManager中实现也很容易理解,这是为了代码复用,因为由相当一部分子类的run实现逻辑是相同的,抽出这一部分代码封装到单独的类中就可以减少重复代码。

相关文章

  • Druid中的依赖注入——Guice

    前言:作为一个大型的开源项目,其设计模式,代码架构和设计理念中必然有值得我们学习和了解的内容。同时作为一个成千上万...

  • Druid源码阅读——Server启动流程

    Druid的代码里面使用了大量的Google Guice依赖注入(DI),还是第一次接触Guice。相比于Spri...

  • Java Vert.x 集成Guice

    Java Vert.x 集成Guice Guice介绍 Guice是谷歌推出的一个轻量级依赖注入框架,帮助我们解决...

  • 3.Guice轻量级注解Guice简单之美

    Guice[https://github.com/google/guice]是谷歌推出的一个轻量级依赖注入框架,帮...

  • Guice

    「Guice」依赖注入框架中的小清新单例情况下轻量级的DI呗。

  • Guice依赖注入(接口多实现)

    本教程主要详细讲解Guice依赖注入中的特性接口多实现,一般使用到guice的框架的插件机制都是基于该方式实现。 ...

  • Guice依赖注入(一)

    本教程主要详细讲解Guice的一些基本注入方式,通过该简单教程让我们可以快速使用Guice进行简单系统化开发,后续...

  • 啥?啥是控制反转,依赖注入啊!?

    依赖倒置,控制反转,依赖注入及Google Guice 1. 依赖倒置 依赖 字面意思事物之间具有的一种关系。在...

  • Guice 快速入门

    Guice是谷歌推出的一个轻量级依赖注入框架,帮助我们解决Java项目中的依赖注入问题。如果使用过Spring的话...

  • Guice 教程(1)

    Guice 是谷歌推出的一款轻量级的依赖注入(DI)框架,它帮我们解决Java项目中的依赖注入问题,提高了可维护性...

网友评论

    本文标题:Druid中的依赖注入——Guice

    本文链接:https://www.haomeiwen.com/subject/iwbmgctx.html