Elasticsearch源碼分析之一——使用Guice進行依賴注入與模組化系統

來源:互聯網
上載者:User
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:用戶端模組

接下來的文章會分析其中一些重要的模組。

參考資料:http://www.searchtech.pro/articles/2013/02/15/1360942810308.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.