Google Guice 是一个依赖注入库,它允许您通过声明对象之间的关系来简单地构造对象。当需要构造其他对象时才会构建对象。您还可以通过配置 Guice 来实现具有不同实现的抽象类或接口,这使得它非常适用于运行或测试代码。
@Inject
注释构造函数和方法以确定初始化对象所需的内容。还有很多其他注释确定 Guice 的工作方式。但是仅仅注释对象是不够的;您还必须使用Guice 绑定来配置它们。
下面是一个非常简单的例子(来自我的一个应用程序)。我有一个需要MysqlConnectionPoolDataSource
的MySQLDataTracker
:
public class MySQLDataTracker extends ExperimentDataTracker {
@Inject
public MySQLDataTracker(MysqlConnectionPoolDataSource ds) {
....
}
}
请注意,MySQLDataTracker
扩展了 ExperimentDataTracker
,这是一个可以通过多种方式实现的抽象类。在我的 Guice 绑定中,我声明了以下内容:
bind(ExperimentDataTracker.class).to(MySQLDataTracker.class)
这意味着每当我需要一个 ExperimentDataTracker
时,将构建一个 MySQLDataTracker
。我还需要确保构建此对象所需的必要对象可用,因此我声明了一个提供程序:
@Provides @Singleton
MysqlConnectionPoolDataSource getMysqlCPDS() {
return (some thingy I construct...);
}
这意味着只应该有一个连接池数据源。这也意味着当我尝试获取ExperimentDataTracker
的实例时,Guice有构造它所需的一切。如果没有上述内容,它将抛出错误。
ExperimentDataTracker tracker = injector.getInstance(ExperimentDataTracker.class)
然而,这还不止。其他事情也取决于ExperimentDataTracker
,因此它被用于依次注入其他对象。在我的代码顶层,实际上只有一个对getInstance
的调用,它使Guice构造几乎所有东西。我不必在任何地方编写new
语句。
在看到Guice如何减少我初始化一堆对象以初始化其他对象的需求后,我成为了它的忠实粉丝。基本上我只需要请求我想要的对象,然后它就出现了。