使用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:客户端模块

接下来的文章会分析其中一些重要的模块。

参考资料:

上帝助自助者。

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

相关文章:

你感兴趣的文章:

标签云: