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

问题描述 投票:0回答:1

我见过一个用它唯一的构造函数声明的类被

@Inject
注释。 而且我没有看到在整个项目的任何地方调用一个构造函数。

所以两个问题:

  1. @Inject
    是什么意思? (它有什么作用?为什么要用它注释构造函数?)
  2. 如前所述,构造函数永远不会被直接调用,这与它用
    @Inject
    注释的事实有什么关系吗?
java annotations inject
1个回答
15
投票

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

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

来配置它们

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

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

© www.soinside.com 2019 - 2024. All rights reserved.