【问题标题】:Migrating project from Guice to Dagger将项目从 Guice 迁移到 Dagger
【发布时间】:2021-05-26 19:14:19
【问题描述】:

我想在当前配置了 Guice 的项目中使用 Dagger。我对 DI 的概念仍然很陌生,但我看到 Guice 和 Dagger 都使用 @Inject@Provides 符号。我对@Module@Component 注释以及如何设置它们有所了解,但我想知道@Inject@Provides 是否可以基本上保持原样?

例如,假设我在 Guice 中有这个:

public class ModuleA extends AbstractModule {

   @Inject
   public ModuleA() {
     ...
   }

   @Provides
   @Singleton
   protected InterfaceX() {
    ...
   }

}

假设还有一个组件等,以下 dagger 实现是否可以相同?

@Module
public class ModuleA {

   @Inject
   public ModuleA() {
     ...
   }

   @Provides
   @Singleton
   protected InterfaceX() {
    ...
   }

}

让我感到困惑的一件事是 @Provides 在 Dagger 中用于将实现绑定到接口,我不确定它是否在 Guice 中用于此目的。 同样,我对此很陌生,所以任何澄清都将不胜感激。谢谢!

【问题讨论】:

    标签: java dependency-injection guice dagger


    【解决方案1】:

    注意:没有使用过 Dagger,但可以在 Guice 方面澄清一下。

    Guice 中的@Provides 用于通知 Guice 注入器在构建时使用哪种方法来创建请求的对象。 例如:类 Parent 在 2 个子类 Child1 和 Child2 中实现 现在你想要一个定义何时注入 Child1 和何时注入 child2 的逻辑。这个逻辑可以写在一个方法中,该方法可以成为 Parent 类 impl 的提供者。并声明这个提供者方法,使用@Provides注解

    class Parent {}
    class Child1 extends Parent {}
    class child2 extends Parent {}
    
    GuieModule {
        @Provides
        Parent getParent() {
        if(something)
            return new Child1();
        else 
            return new child2();
        }
    }
    

    【讨论】:

    • 据我了解,这也是他在 Dagger 中的工作方式。然而,在 Guice 中,这与 bind(A).to(B) 表示法有何不同?
    • 在 guice 中,bind(A).to(B) 是一种静态方式。您需要知道在编译时将使用哪个实现。但是@Provides 可以帮助您灵活地决定在运行时使用哪个实现,因为它可以帮助您包含决定使用哪个 impl 的逻辑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 2010-12-09
    • 2015-02-09
    • 1970-01-01
    • 2011-07-13
    • 2011-07-17
    • 2011-02-10
    相关资源
    最近更新 更多