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