Java 匕首2:如何在不注入字段的情况下注入字段';什么是排字课?

Java 匕首2:如何在不注入字段的情况下注入字段';什么是排字课?,java,dagger-2,Java,Dagger 2,我的类A需要类C的依赖注入。 C类是B类的组件(B将C作为字段)。 A类可以在不使用B类注入的情况下注入C类吗 [A注入]->(B未注入A)->[C注入B] 在我的实际项目中,我需要将字段注入到一个类中,但不需要将注入队列添加到包含(直接或间接)此字段的所有类中 目前我在B班有个例外: Exception in thread "main" java.lang.NullPointerException at B.log(B.java:28) at

我的类A需要类C的依赖注入。 C类是B类的组件(B将C作为字段)。 A类可以在不使用B类注入的情况下注入C类吗

[A注入]->(B未注入A)->[C注入B]

在我的实际项目中,我需要将字段注入到一个类中,但不需要将注入队列添加到包含(直接或间接)此字段的所有类中

目前我在B班有个例外:

Exception in thread "main" java.lang.NullPointerException
        at B.log(B.java:28)
        at A.b_foo(A.java:28)
        at App.main(App.java:36)
请给我一些建议。 代码:

App.java

import dagger.Component;
import javax.inject.Singleton;
 
public class App {
  @Singleton
  @Component(
      modules = {
              CModule.class
             }
  )
  public interface AppRunner {
    A instance();
  }

  public static void main(String[] args) {
    AppRunner appRunner = DaggerApp_AppRunner.builder().build();
    appRunner.instance().foo();
  }
}
A.java

import javax.inject.Inject;

public class A {
    private final B b;

    @Inject
    A() {
        this.b = new B();
    }

    public void foo() {
        b.log();
    }
}
B.java

import javax.inject.Inject;

public class B {

  @Inject
  C c;

  B() { }

  public void log() {
      c.log("in C log"); //java.lang.NullPointerException here because B was not injected before C
  }
}
C.java

import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.ArrayList;
import java.util.List;

@Singleton
public final class C {
  private final List<String> logs = new ArrayList<>();

  @Inject
  C() {}

  public void log(String msg) {
    logs.add(msg);
  }
}

更新:我可以完全没有B注入工作代码吗?我的A班同学知道匕首。但是A必须没有B注入。

在类
B
中有一个
@Inject
字段,并且希望能够在
A
中获得完全初始化的
B

选项1:只需向构造函数添加
@Inject
就这样。您不需要将依赖项移动到构造函数中

public class B {

  @Inject
  C c;

  @Inject // This annotation is the only thing added.
  B() { }

  public void log() {
      c.log("in C log");
  }
}
如果这甚至超出了您在
B
中想要更改(或可以更改)的范围,请继续阅读

选项2:注入
MembersInjector
Dagger包含一个接口,它完全按照它听起来的样子工作。您可以将
MembersInjector
注入
A
,并使用它分两步构造
B

@Inject
A(MembersInjector<B> injector) {
    this.b = new B();
    injector.injectMembers(b);
}

现在,您可以在任何地方插入
B
Provider
,而无需修改
B

在类
B
中有一个
@inject
字段,您希望能够在
a
中获得完全初始化的
B

选项1:只需向构造函数添加
@Inject
就这样。您不需要将依赖项移动到构造函数中

public class B {

  @Inject
  C c;

  @Inject // This annotation is the only thing added.
  B() { }

  public void log() {
      c.log("in C log");
  }
}
如果这甚至超出了您在
B
中想要更改(或可以更改)的范围,请继续阅读

选项2:注入
MembersInjector
Dagger包含一个接口,它完全按照它听起来的样子工作。您可以将
MembersInjector
注入
A
,并使用它分两步构造
B

@Inject
A(MembersInjector<B> injector) {
    this.b = new B();
    injector.injectMembers(b);
}

现在您可以在任何地方插入
B
Provider
,而无需修改
B

什么是
AppRunner
DaggerApp\u AppRunner
?请提供一份报告。您可以在字段上使用@Inject作为构造函数吗?这样,您就不得不使用对象
C
(您从某处获得)创建对象
B
。@Progman,已经提供了最小的可复制示例。所有的课程都在上面。阿普伦纳宣布。DaggerApp_AppRunner由Dagger在运行时生成。是否可以选择在
a
类中插入
提供程序,如中所述?这样,您就可以使用
get()
方法获取
C
对象,并使用
C
类的实例调用
B
的构造函数。@Progman,在我的实际项目中,在这种情况下,我将有太多的get调用。在本例中,我只有一个B类,但在我的实际项目中,我有10个类,如从A到C的链中的B类。将
提供者
注入类
A
会起作用吗?这样,您可以根据需要从dagger请求
B
对象,而不是使用
new B()“手动”。这还应该注入所有其他依赖项,如
B
中带注释的
C
字段。什么是
AppRunner
DaggerApp\u AppRunner
?请提供一份报告。您可以在字段上使用@Inject作为构造函数吗?这样,您就不得不使用对象
C
(您从某处获得)创建对象
B
。@Progman,已经提供了最小的可复制示例。所有的课程都在上面。阿普伦纳宣布。DaggerApp_AppRunner由Dagger在运行时生成。是否可以选择在
a
类中插入
提供程序,如中所述?这样,您就可以使用
get()
方法获取
C
对象,并使用
C
类的实例调用
B
的构造函数。@Progman,在我的实际项目中,在这种情况下,我将有太多的get调用。在本例中,我只有一个B类,但在我的实际项目中,我有10个类,如从A到C的链中的B类。将
提供者
注入类
A
会起作用吗?这样,您可以根据需要从dagger请求
B
对象,而不是使用
new B()“手动”。这还应该注入所有其他依赖项,如
B
中带注释的
C
字段。回答不错。我可以完全没有B注入的工作代码吗?我的A班同学知道匕首。但是A一定没有注射B。回答得好。我可以完全没有B注入的工作代码吗?我的A班同学知道匕首。但是A不能注射B。