关闭

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

标签: elasticsearch
906人阅读 评论(0) 收藏 举报
分类:
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这类注释,找到方法中传入参数的实例进行注入。如上面的CreditCardProcessor和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:客户端模块
接下来的文章会分析其中一些重要的模块。

参考资料:http://www.searchtech.pro/articles/2013/02/15/1360942810308.html
0
0
查看评论

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

1. 使用Guice进行依赖注入与模块化系统 elasticsearch使用google开源的依赖注入框架guice,这个项目号称比spring快100倍,具体性能没有测试过,不过由于其代码比较简洁,比spring快很有可能,是不是快那么多就不知道了。先介绍下guice的基本使用方法。 elast...
  • ljc2008110
  • ljc2008110
  • 2015-09-22 13:51
  • 728

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

elasticsearch使用google开源的依赖注入框架guice,这个项目号称比spring快100倍,具体性能没有测试过,不过由于其代码比较简洁,比spring快很有可能,是不是快那么多就不知道了。先介绍下guice的基本使用方法。 elasticsearch是直接把guice的源码放到自...
  • july_2
  • july_2
  • 2014-04-29 16:55
  • 1690

依赖注入及Guice简述

Guice简介    Guice是一个轻量级,基于Java5(主要运用泛型与注释特性)的依赖注入框架(IOC)。    Guice非常小而且快。    Guice是类型安全的,它能够对构造函数,属性,方法(包含任意个参数的任意方法,而不仅仅...
  • ChaosJ
  • ChaosJ
  • 2016-04-13 13:51
  • 1184

使用guice进行依赖注入与模块化系统

一、Guice介绍 1,Guice是Google开发的一个轻量级,基于Java5(主要运用泛型与注释特性)的依赖注入框架(IOC)。Guice非常小而且快。Guice是类型安全的,它能够对构造函数,属性,方法(包含任意个参数的任意方法,而不仅仅是setter方法)进行注入。 2,elast...
  • acm365
  • acm365
  • 2017-06-25 11:59
  • 550

Google Guice 依赖注入框架:简明教程

Guice是一个轻量级的依赖注入框架。用于对象之间的依赖的注入。 本文的所有例子基于Guice 4.0 Guice的使用: Guice的使用涉及接口,接口的实现类,接口与其实现类的绑定关系三个方面。 定义一个接口:   public interface ...
  • jiasanshou
  • jiasanshou
  • 2015-09-30 16:47
  • 4134

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

elasticsearch使用google开源的依赖注入框架guice,这个项目号称比spring快100倍,具体性能没有测试过,不过由于其代码比较简洁,比spring快很有可能,是不是快那么多就不知道了。先介绍下guice的基本使用方法。 elasticsearch是直接把guice的源码放到自己...
  • xgjianstart
  • xgjianstart
  • 2017-04-12 11:24
  • 176

Google Guice 入门教程02 - 依赖注入(2)

Google Guice 入门教程02 - 依赖注入(2) 1.2 属性注入(Field Inject) 1.2.1 基本属性注入 首先来看一个例子。Service.java 1 @ImplementedBy(ServiceImpl.class) 2 public interfa...
  • cwyspy
  • cwyspy
  • 2013-12-30 15:35
  • 467

Guice 依赖注入

简介 Java企业应用开发社区在连接对象方面花了很大功夫。你的Web应用如何访问中间层服 务?你的服务如何连接到登录用户和事务管理器?关于这个问题你会发现很多通用的和特 定的解决方案。有一些方案依赖于模式,另一些则使用框架。所有这些方案都会不同程度 地引入一些难于测试或者程式化代码重复的问题。你马...
  • zengqiang1
  • zengqiang1
  • 2016-11-22 10:22
  • 696

Google Guice - 轻量级 DI 依赖注入框架

Guice简单使用 示例代码 Anddd7/Demo-Guice 参考了 博客 - Google Guice 系列教程 和 Github - greengerong/guice-demo Guice是一个DI (依赖注入) 框架 ,和Spring的依赖注入基本相同 轻量级 ,启动迅速 ...
  • u011858405
  • u011858405
  • 2017-03-09 16:28
  • 474

Angularjs学习笔记(四)模块化与依赖注入

一、路由ngRoute服务 随着web应用越来越大,一个应用里面存在多个视图。在不同的视图之间进行切换时(url),为了支持浏览器的“前进、后退、history”,angular有ngRoute服务,提供$routeProvider通常我们的URL形式为http ://runoob.com/fir...
  • qq_25178609
  • qq_25178609
  • 2016-10-04 19:52
  • 286
    个人资料
    • 访问:321481次
    • 积分:4263
    • 等级:
    • 排名:第8485名
    • 原创:42篇
    • 转载:444篇
    • 译文:1篇
    • 评论:18条
    最新评论