当前位置:首页 > 开发 > 行业应用 > 正文

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

发表于: 2014-10-10   作者:aoyouzi   来源:转载   浏览次数:
摘要: Elasticsearch源码分析之一——使用Guice进行依赖注入与模块化系统   elasticsearch使用google开源的依赖注入框架guice,这个项目号称比spring快100倍,具体性能没有测试过,不过由于其代码比较简洁,比spring快很有可能,是不是快那么多就不知道了。先介绍下guice的基本使用方法。 elasticsearch是直接把guice的源码放到自

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官方文档中的例子:
[java]  view plain copy
 
 
  1. public class BillingModule extends AbstractModule {  
  2.   @Override   
  3.   protected void configure() {  
  4.     bind(TransactionLog.class).to(DatabaseTransactionLog.class);  
  5.     bind(CreditCardProcessor.class).to(PaypalCreditCardProcessor.class);  
  6.     bind(BillingService.class).to(RealBillingService.class);  
  7.   }  
  8. }  
上面定义了一个订单模块,扩展AbstractModule这个抽象类。这个模块里面有三个实例:交易日志、支付过程和账单服务。通过bind("interface").to("implement")来使接口和实现绑定。
[java]  view plain copy
 
 
  1. public class RealBillingService implements BillingService {  
  2.   private final CreditCardProcessor processor;  
  3.   private final TransactionLog transactionLog;  
  4.   
  5.   @Inject  
  6.   public RealBillingService(CreditCardProcessor processor,  
  7.       TransactionLog transactionLog) {  
  8.     this.processor = processor;  
  9.     this.transactionLog = transactionLog;  
  10.   }  
  11.   
  12.   public Receipt chargeOrder(PizzaOrder order, CreditCard creditCard) {  
  13.     try {  
  14.       ChargeResult result = processor.charge(creditCard, order.getAmount());  
  15.       transactionLog.logChargeResult(result);  
  16.   
  17.       return result.wasSuccessful()  
  18.           ? Receipt.forSuccessfulCharge(order.getAmount())  
  19.           : Receipt.forDeclinedCharge(result.getDeclineMessage());  
  20.      } catch (UnreachableException e) {  
  21.       transactionLog.logConnectException(e);  
  22.       return Receipt.forSystemFailure(e.getMessage());  
  23.     }  
  24.   }  
  25. }  
上面类是BillService接口的实现类。其中要注意的就是@Inject这个注释。Guice的Injector类会扫描@Inject这类注释,找到方法中传入参数的实例进行注入。如上面的CreditCardLog和TransactionLog。
[java]  view plain copy
 
 
  1. public static void main(String[] args) {  
  2.     Injector injector = Guice.createInjector(new BillingModule());  
  3.     BillingService billingService = injector.getInstance(BillingService.class);  
  4.     ...  
  5.   }  
最后,在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:客户端模块
接下来的文章会分析其中一些重要的模块。

 

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

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
在 mvc 4 中使用 unity 进行依赖注入 关于依赖注入的概念,这里就不再叙述了,我们用 mvc 4 结合 un
Google Guice3.0: http://code.google.com/p/google-guice/ maven地址: <dependency> <g
阅读源码肯定是先下载有注释的源码 我也是醉了,10309 行代码,在陆续续的一个月之内,看完了,虽有
写在前面 构造器注入 Dependency属性注入 InjectionMethod方法注入 非泛型注入 标识键 ContainerCon
默认elasticsearch是使用netty作为http的容器,由于netty并没有权限模块,所以默认es没有任何的权限
默认elasticsearch是使用netty作为http的容器,由于netty并没有权限模块,所以默认es没有任何的权限
An Article from Fluentd Overview Elasticsearch, Fluentd, and Kibana (EFK) allow you to collec
Spring依赖注入 --- 简单使用说明 本文将对spring依赖注入的使用做简单的说明,enjoy your time! 1
前言 好久没写博客了,罪过啊~记事本里累积了不少东西,整理整理放上来。 关于依赖注入 Dependency
目录 1 IGame游戏公司的故事 1.1 讨论会 1.2 实习生小李的实现方法 1.3 架构师的建议 1.4 小李的小
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号