8

我已经看到一个声明了一个类,它的唯一构造函数用@Inject. 而且我没有看到在整个项目的任何地方都调用了一个构造函数。

所以两个问题:

<1> 什么@Inject意思?(它有什么作用?为什么构造函数被它注解?)

<2> 如前所述,构造函数永远不会被直接调用,这与它被注释的事实有什么关系@Inject吗?

4

1 回答 1

14

Google Guice是一个依赖注入库,它允许您通过声明它们之间的关系来构造对象。对象的构造是因为它们被要求构造其他对象。您还可以通过配置 Guice 来实现具有不同实现的抽象类或接口,这对于运行或测试代码非常有用。

@Inject注释确定对象需要初始化的构造函数和方法。还有很多其他的注释决定了 Guice 的工作方式。但是仅仅注释对象是不够的;您还必须使用Guice 绑定配置它们。

这是一个非常简单的示例(来自我的一个应用程序)。我有一个MySQLDataTracker需要MysqlConnectionPoolDataSource

public class MySQLDataTracker extends ExperimentDataTracker {
    @Inject
    public MySQLDataTracker(MysqlConnectionPoolDataSource ds) {
        ....
    }
}

请注意,MySQLDataTrackerextendsExperimentDataTracker是一个可以通过多种方式实现的抽象类。在我的 Guice 绑定中,我声明

bind(ExperimentDataTracker.class).to(MySQLDataTracker.class);

这声明每当我想要ExperimentDataTrackera 时,MySQLDataTracker都会构造 a 。我还需要确保构造它的必要对象可用,所以我声明了一个提供者:

@Provides @Singleton 
MysqlConnectionPoolDataSource getMysqlCPDS() {
    return (some thingy I construct...);            
}

这表示应该只有一个连接池数据源。这也意味着当我尝试获取 的实例时ExperimentDataTracker,Guice 拥有构建它所需的一切。如果我没有上述内容,它将引发错误。

ExperimentDataTracker tracker = injector.getInstance(ExperimentDataTracker.class);

然而,它并不止于此。其他的东西依赖于ExperimentDataTracker,所以它反过来被用来注入其他对象。在我的代码的顶层实际上只有一次调用getInstance,这使得 Guice 几乎可以构建所有内容。我不必在new任何地方写声明。

在看到 Guice 如何减少初始化一堆对象以初始化其他对象的需要后,我成为了 Guice 的忠实粉丝。基本上我只是要求我想要的对象,然后噗!它出现。

于 2013-03-20T22:30:33.463 回答