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 extends AbstractModule {
- @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 implements BillingService {
- private final CreditCardProcessor processor;
- private final TransactionLog transactionLog;
- @Inject
- public RealBillingService(CreditCardProcessor processor,
- TransactionLog transactionLog) {
- this.processor = processor;
- this.transactionLog = transactionLog;
- }
- public Receipt chargeOrder(PizzaOrder order, CreditCard creditCard) {
- try {
- ChargeResult result = processor.charge(creditCard, order.getAmount());
- transactionLog.logChargeResult(result);
- return result.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:客户端模块
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进行依赖注入和模块化系统设计,从而达到更好的扩展性和灵活性。源码分析能够帮助开发者更深入地理解Elasticsearch的工作原理,以便能够更好地进行调试和优化。 在遇到问题和...
《Android应用源码之游戏源码——忍者快跑》是一款基于Android平台的移动游戏,其源码提供了深入了解Android游戏开发的机会。通过分析这个项目的源码,我们可以学习到许多关于Android游戏开发的关键知识点。 首先,...
Android支持OpenGL ES,这是一种专为嵌入式系统设计的图形库,游戏源码中可能包含了OpenGL ES的调用来创建3D或2D图形。 4. **物理引擎**:为了模拟真实的物理效果,如碰撞检测和重力,游戏可能使用了Box2D或其他...
Elasticsearch 5.4.0 是一个流行的开源搜索引擎和分析引擎,广泛应用于大数据处理、日志分析、实时搜索和监控等场景。它基于 Lucene 库构建,提供了分布式、可扩展、近实时的搜索与分析功能。Maven 是 Java 项目管理...
而Elasticsearch(ES)则是一款强大的全文搜索引擎,常用于大数据分析和实时搜索。本篇文章将详细介绍如何将Mybatis的Mapper方式与Elasticsearch的DSL(Domain Specific Language)查询相结合,以及如何通过CGlib...
Elasticsearch是一款强大的开源搜索引擎,广泛应用于数据存储、分析和检索。Java客户端Jest是与Elasticsearch交互的一种高效工具,它提供了简单的API,使得在Java应用中操作Elasticsearch变得简单易行。本资源包含的...
Elasticsearch源码分析 Elasticsearch是一款基于Lucene的分布式、RESTful搜索和数据分析引擎。它的源码解析对于我们深入理解其内部工作原理至关重要。在深入探讨之前,我们需要知道几个核心概念:分布式、RESTful ...
"安卓Android源码——游戏源码——忍者快跑.zip"是一个包含了一个具体游戏项目源码的压缩包,我们可以从中学到许多关于Android游戏开发的知识。 1. **Android游戏架构**: 游戏通常基于特定的架构来构建,例如...
Elasticsearch是一款开源的、分布式、实时的搜索与分析引擎,它被广泛用于日志分析、全文检索以及复杂的数据分析场景。下面将详细介绍如何在Spring Boot项目中集成这两个关键的Elasticsearch依赖,并探讨其工作原理...
《Android应用源码开发Demo——忍者快跑》是一款基于Android平台的游戏开发示例,适合于计算机科学与技术专业的学生进行毕业设计学习。通过这款源码,你可以深入了解Android游戏开发的基本流程、技术栈以及实现机制...
ebatis是一个易于使用的Elasticsearch ORM框架,采用Java语言开发,源码文件共计471个,其中Java源文件457个,XML配置文件8个,属性文件2个,Git忽略文件1个,LICENSE文件1个,Markdown文件1个以及YAML文件1个。
为了在Java应用中方便地使用Elasticsearch,可以通过Spring Data Elasticsearch模块进行整合。首先,需要在项目中引入相关依赖,然后配置Elasticsearch的连接信息。接下来,定义Repository接口,Spring Data会自动...
使用Guice进行依赖注入与模块化系统** ElasticSearch使用Guice框架来管理和注入依赖,这有助于提高代码的可维护性和可扩展性。 **6.2. 索引过程源码概要分析** 通过对索引过程的源码分析,可以深入了解文档如何...
在本项目中,我们主要探讨的是如何将流行的Java框架Spring Boot与强大的全文搜索引擎Elasticsearch进行集成。这个"SpringBoot整合Elasticsearch完整源码"提供了实现这一目标的详细步骤和代码实例。以下是对相关知识...
6. **存储与数据持久化**:游戏数据的保存和读取也是关键,源码可能展示了SharedPreferences、SQLite数据库或文件系统的使用,以实现游戏进度的保存和加载。 7. **用户交互**:Android的触摸事件处理机制在游戏中的...
- **Elasticsearch-JDBC**:允许将Elasticsearch作为数据源,与SQL兼容的系统进行集成。 - **Python Elasticsearch Client**:为Python开发者提供的官方客户端,支持所有Elasticsearch API。 - **Nest**(.NET ...
十分钟学会使用 Elasticsearch 优雅搭建自己的搜索系统。 什么是elasticsearch Elasticsearch 是一个开源的高度可扩展的全文搜索和分析引擎,拥有查询近实时的超强性能。 大名鼎鼎的Lucene 搜索引擎被广泛用于搜索...
Spark 可以通过 Elasticsearch API 直接读取和写入 Elasticsearch,进行数据预处理、清洗、转换和分析,然后将结果存储回 Elasticsearch,形成一个完整的数据流水线。这种方式使得数据处理和检索的性能得到大幅提升...
SpringBoot 源码解析——源码模块功能分析 SpringBoot 源码解析是指对 SpringBoot 框架的源码进行深入分析和研究,以了解框架的内部机制和工作原理。源码模块是 SpringBoot 框架的核心组成部分,它们之间的交互和...