有人可以解释一下com.google.inject的作用吗?

时间:2013-03-20 22:22:58

标签: java annotations inject

我见过一个声明的类,其唯一的构造函数用@Inject注释。 而且我没有看到在整个项目中任何地方都调用了一个构造函数。

所以有两个问题:

&LT 1为卤素; @Inject是什么意思? (它做了什么?为什么构造函数用它注释?)

&LT 2 - ;如上所述,构造函数永远不会被直接调用,这是否与使用@Inject注释的事实有关?

1 个答案:

答案 0 :(得分:6)

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

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

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

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的忠实粉丝,看到它如何减少了我初始化一堆对象以初始化其他对象的需要。基本上我只是要求我想要的对象和噗!它出现了。