`

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 plaincopy
 
 
  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 plaincopy
 
 
  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 plaincopy
 
 
  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文档.pdf

    关于源码分析,Elasticsearch使用Guice进行依赖注入和模块化系统设计,从而达到更好的扩展性和灵活性。源码分析能够帮助开发者更深入地理解Elasticsearch的工作原理,以便能够更好地进行调试和优化。 在遇到问题和...

    Android应用源码之游戏源码——忍者快跑.zip

    《Android应用源码之游戏源码——忍者快跑》是一款基于Android平台的移动游戏,其源码提供了深入了解Android游戏开发的机会。通过分析这个项目的源码,我们可以学习到许多关于Android游戏开发的关键知识点。 首先,...

    Android源码——游戏源码——忍者快跑.zip

    Android支持OpenGL ES,这是一种专为嵌入式系统设计的图形库,游戏源码中可能包含了OpenGL ES的调用来创建3D或2D图形。 4. **物理引擎**:为了模拟真实的物理效果,如碰撞检测和重力,游戏可能使用了Box2D或其他...

    elasticsearch 5.4.0 maven依赖jar包

    Elasticsearch 5.4.0 是一个流行的开源搜索引擎和分析引擎,广泛应用于大数据处理、日志分析、实时搜索和监控等场景。它基于 Lucene 库构建,提供了分布式、可扩展、近实时的搜索与分析功能。Maven 是 Java 项目管理...

    Mybatis的Mapper方式整合elasticsearch的DSL调用,基于接口和代理生成bean注入的方式进行调用

    而Elasticsearch(ES)则是一款强大的全文搜索引擎,常用于大数据分析和实时搜索。本篇文章将详细介绍如何将Mybatis的Mapper方式与Elasticsearch的DSL(Domain Specific Language)查询相结合,以及如何通过CGlib...

    Elasticsearch之Java客户端Jest的全部依赖jar包

    Elasticsearch是一款强大的开源搜索引擎,广泛应用于数据存储、分析和检索。Java客户端Jest是与Elasticsearch交互的一种高效工具,它提供了简单的API,使得在Java应用中操作Elasticsearch变得简单易行。本资源包含的...

    elasticsearch源码

    Elasticsearch源码分析 Elasticsearch是一款基于Lucene的分布式、RESTful搜索和数据分析引擎。它的源码解析对于我们深入理解其内部工作原理至关重要。在深入探讨之前,我们需要知道几个核心概念:分布式、RESTful ...

    安卓Android源码——游戏源码——忍者快跑.zip

    "安卓Android源码——游戏源码——忍者快跑.zip"是一个包含了一个具体游戏项目源码的压缩包,我们可以从中学到许多关于Android游戏开发的知识。 1. **Android游戏架构**: 游戏通常基于特定的架构来构建,例如...

    SpringBoot 集成ElasticSearch两个依赖的jar

    Elasticsearch是一款开源的、分布式、实时的搜索与分析引擎,它被广泛用于日志分析、全文检索以及复杂的数据分析场景。下面将详细介绍如何在Spring Boot项目中集成这两个关键的Elasticsearch依赖,并探讨其工作原理...

    Android应用源码之游戏源码——忍者快跑-IT计算机-毕业设计.zip

    《Android应用源码开发Demo——忍者快跑》是一款基于Android平台的游戏开发示例,适合于计算机科学与技术专业的学生进行毕业设计学习。通过这款源码,你可以深入了解Android游戏开发的基本流程、技术栈以及实现机制...

    elasticsearch安装和使用

    为了在Java应用中方便地使用Elasticsearch,可以通过Spring Data Elasticsearch模块进行整合。首先,需要在项目中引入相关依赖,然后配置Elasticsearch的连接信息。接下来,定义Repository接口,Spring Data会自动...

    ElasticSearch中文学习教程

    使用Guice进行依赖注入与模块化系统** ElasticSearch使用Guice框架来管理和注入依赖,这有助于提高代码的可维护性和可扩展性。 **6.2. 索引过程源码概要分析** 通过对索引过程的源码分析,可以深入了解文档如何...

    SpringBoot整合Elasticsearch完整源码

    在本项目中,我们主要探讨的是如何将流行的Java框架Spring Boot与强大的全文搜索引擎Elasticsearch进行集成。这个"SpringBoot整合Elasticsearch完整源码"提供了实现这一目标的详细步骤和代码实例。以下是对相关知识...

    安卓Android源码——四款小游戏源码分析.zip

    6. **存储与数据持久化**:游戏数据的保存和读取也是关键,源码可能展示了SharedPreferences、SQLite数据库或文件系统的使用,以实现游戏进度的保存和加载。 7. **用户交互**:Android的触摸事件处理机制在游戏中的...

    十分钟学会使用 Elasticsearch 优雅搭建自己的搜索系统.pdf

    十分钟学会使用 Elasticsearch 优雅搭建自己的搜索系统。 什么是elasticsearch Elasticsearch 是一个开源的高度可扩展的全文搜索和分析引擎,拥有查询近实时的超强性能。 大名鼎鼎的Lucene 搜索引擎被广泛用于搜索...

    ElasticSearch+Spark 构建高匹配度搜索服务,个性化推荐系统源码

    Spark 可以通过 Elasticsearch API 直接读取和写入 Elasticsearch,进行数据预处理、清洗、转换和分析,然后将结果存储回 Elasticsearch,形成一个完整的数据流水线。这种方式使得数据处理和检索的性能得到大幅提升...

    SpringBoot 源码解析——源码模块功能分析.docx

    SpringBoot 源码解析——源码模块功能分析 SpringBoot 源码解析是指对 SpringBoot 框架的源码进行深入分析和研究,以了解框架的内部机制和工作原理。源码模块是 SpringBoot 框架的核心组成部分,它们之间的交互和...

    Elasticsearch技术解析与实战+Elasticsearch权威指南

    Elasticsearch是一款强大的开源搜索引擎,基于Lucene库构建,广泛应用于大数据分析、日志收集、实时搜索等领域。本文将深入解析Elasticsearch的核心概念、架构原理,并结合实战案例,帮助你全面掌握这一技术。 首先...

    Intellij IDEA编译调试Elasticsearch 6.1.0源码

    Elasticsearch是一个基于Lucene构建的开源搜索引擎,它允许用户快速执行全文搜索、结构化搜索甚至是复杂分析。Intellij IDEA是一个强大的集成开发环境(IDE),它广泛用于Java开发,并支持其他编程语言和框架,包括...

Global site tag (gtag.js) - Google Analytics