ElasticSearch源码分析之一:使用Guice进行依赖注入与模块化系统

elasticsearch使用google开源的依赖注入框架guice,这个项目号称比spring快100倍,具体性能没有测试过,不过由于其代码比较简洁,比spring快很有可能,是不是快那么多就不知道了。先介绍下guice的基本使用方法。

elasticsearch是直接把guice的源码放到自己的包内(es把很多开源项目的代码都直接集成到自己项目中,省得依赖一堆的jar包,也使es的jar包达到差不多10M),在org.elasticsearch.common.inject目录下。

Guice主要是使用Module这个接口来确定各个接口和它们对应的实现。这个Module是个单例的抽象接口,通过bind(A).to(B)来绑定指定实例到这个模块中,下面看下Guice官方文档中的例子:

    public class BillingModule extendsAbstractModule { 
      @Override  
      protected void configure() { 
        bind(TransactionLog.class).to(DatabaseTransactionLog.class); 
       bind(CreditCardProcessor.class).to(PaypalCreditCardProcessor.class); 
       bind(BillingService.class).to(RealBillingService.class); 
      } 
    } 


上面定义了一个订单模块,扩展AbstractModule这个抽象类。这个模块里面有三个实例:交易日志、支付过程和账单服务。通过bind("interface").to("implement")来使接口和实现绑定。

    public class RealBillingService implementsBillingService { 
      private final CreditCardProcessorprocessor; 
      private final TransactionLogtransactionLog; 
     
      @Inject 
      publicRealBillingService(CreditCardProcessor processor, 
          TransactionLog transactionLog) { 
        this.processor = processor; 
        this.transactionLog =transactionLog; 
      } 
     
      public Receipt chargeOrder(PizzaOrderorder, CreditCard creditCard) { 
        try { 
          ChargeResult result =processor.charge(creditCard, order.getAmount()); 
         transactionLog.logChargeResult(result); 
                returnresult.wasSuccessful() 
              ?Receipt.forSuccessfulCharge(order.getAmount()) 
              :Receipt.forDeclinedCharge(result.getDeclineMessage()); 
         } catch (UnreachableException e){ 
         transactionLog.logConnectException(e); 
          return Receipt.forSystemFailure(e.getMessage()); 
        } 
      } 
    } 

上面类是BillService接口的实现类。其中要注意的就是@Inject这个注释。Guice的Injector类会扫描@Inject这类注释,找到方法中传入参数的实例进行注入。如上面的CreditCardLog和TransactionLog。

    public static void main(String[] args){ 
        Injector injector =Guice.createInjector(new BillingModule()); 
        BillingService billingService =injector.getInstance(BillingService.class); 
        ... 
      } 

最后,在main方法中使用Injector进行注入与获取实例。这就是使用Guice进行依赖注入的一个简单例子。elasticsearch里面的组件基本都是用上面的方式进行模块化管理,elasticsearch对guice进行了简单的封装,通过ModulesBuilder类构建es的模块,一个es节点包括下面模块:

PluginsModule:插件模块

SettingsModule:设置参数模块

NodeModule:节点模块

NetworkModule:网络模块

NodeCacheModule:缓存模块

ScriptModule:脚本模块

JmxModule:jmx模块

EnvironmentModule:环境模块

NodeEnvironmentModule:节点环境模块

ClusterNameModule:集群名模块

ThreadPoolModule:线程池模块

DiscoveryModule:自动发现模块

ClusterModule:集群模块

RestModule:rest模块

TransportModule:tcp模块

HttpServerModule:http模块

RiversModule:river模块

IndicesModule:索引模块

SearchModule:搜索模块

ActionModule:行为模块

MonitorModule:监控模块

GatewayModule:持久化模块

NodeClientModule:客户端模块

接下来的文章会分析其中一些重要的模块。

参考资料:http://www.searchtech.pro/articles/2013/02/15/1360942810308.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值