java 有人能解释一下com.google.inject是做什么的吗?

iqih9akk  于 2023-03-11  发布在  Java
关注(0)|答案(1)|浏览(211)

我看到一个类声明了它唯一的构造函数,并且用@Inject注解,但是我没有看到在整个项目中的任何地方调用了这个构造函数。
所以有两个问题:

  1. @Inject是什么意思?(它做什么?为什么用它来注解构造函数?)
    1.如前所述,构造函数从来不会被直接调用,这与它是用@Inject注解的事实有什么关系吗?
8ehkhllq

8ehkhllq1#

Google Guice是一个依赖注入库,它允许您通过声明对象之间的关系来构造对象。对象是在需要它们来构造其他对象时构造的。您还可以通过配置Guice来实现抽象类或具有不同实现的接口,这使得它对于运行或测试代码非常有用。
@Inject注解了构造函数和方法,它们决定了对象需要初始化什么,还有很多其他注解决定了Guice的工作方式,但是仅仅注解对象是不够的;您还必须使用Guice bindings配置它们。
下面是一个非常简单的例子(来自我的一个应用程序):我有一个MySQLDataTracker,它需要一个MysqlConnectionPoolDataSource

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

注意,MySQLDataTracker扩展了ExperimentDataTrackerExperimentDataTracker是一个抽象类,可以通过多种方式实现。

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

这声明了每当我需要一个ExperimentDataTracker时,就会构造一个MySQLDataTracker,我还需要确保构造它所必需的对象是可用的,所以我声明了一个provider:

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

这意味着应该只有一个连接池数据源,也意味着当我尝试获取ExperimentDataTracker的示例时,Guice拥有构造它所需的一切,如果我没有以上这些,它将抛出一个错误。

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

然而,Guice并没有就此止步。其他事情依赖于ExperimentDataTracker,因此它又被用来注入其他对象。在我的代码的顶层,实际上只有一个对getInstance的调用,这使得Guice构造了几乎所有的东西。我不必在任何地方编写new语句。
我是Guice的忠实粉丝,因为它减少了我初始化一堆对象以初始化其他对象的需要。基本上,我只需要请求我想要的对象,噗!它就出现了。

相关问题