Java 匕首2:如何在不注入字段的情况下注入字段';什么是排字课?
我的类A需要类C的依赖注入。 C类是B类的组件(B将C作为字段)。 A类可以在不使用B类注入的情况下注入C类吗 [A注入]->(B未注入A)->[C注入B] 在我的实际项目中,我需要将字段注入到一个类中,但不需要将注入队列添加到包含(直接或间接)此字段的所有类中 目前我在B班有个例外: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
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。