Java Dagger2模块未被注入其他模块或已弃用
我正试图学习Dagger2,但该模块已被弃用。 我是从以下教程 下面是我的代码Java Dagger2模块未被注入其他模块或已弃用,java,dependency-injection,dagger-2,Java,Dependency Injection,Dagger 2,我正试图学习Dagger2,但该模块已被弃用。 我是从以下教程 下面是我的代码 public class TestApp { @Inject BackendService backendService; private void testServer() { BackendComponent backendComponent = DaggerBackendComponent.builder() .build();
public class TestApp {
@Inject
BackendService backendService;
private void testServer() {
BackendComponent backendComponent = DaggerBackendComponent.builder()
.build();
backendComponent.inject(this);
backendService.call();
}
public static void main(String[] args) {
new TestApp().testServer();
}
}
注入不工作的用户模块
@Module
public class UserModule {
@Provides
@Singleton
User providesUser() {
return new User("John", "Doe");
}
}
后端服务
public class BackendService {
@Inject
public User user;
private String serverUrl;
@Inject
public BackendService(@Named("serverUrl") String serverUrl) {
this.serverUrl = serverUrl;
}
public boolean call() {
if (user != null && serverUrl != null && serverUrl.length() > 0) {
System.out.println("User: " + user.toString());
return true;
} else {
System.err.println("User: " + user);
System.err.println("ServerUrl: " + serverUrl);
return false;
}
}
}
后端服务模块
@Module
public class BackendServiceModule {
@Provides
@Singleton
BackendService proviedBackendServiceModule(@Named("serverUrl") String serverUrl) {
return new BackendService(serverUrl);
}
@Provides
@Named("testUrl")
String provideAnotherUrl() {
return "http://www.facebook.com";
}
@Provides
@Named("serverUrl")
String provideServerUrl() {
return "http://www.google.com";
}
}
后端组件
@Singleton
@Component(modules = {UserModule.class, BackendServiceModule.class})
public interface BackendComponent {
BackendService proviedBackendServiceModule();
void inject(TestApp app);
}
运行后,我得到如下输出:
User: null
ServerUrl: http://www.google.com
如果我尝试下面的代码,它的工作
public class TestApp {
@Inject
User user;
@Inject
BackendService backendService;
private void testServer() {
BackendComponent backendComponent = DaggerBackendComponent.builder()
.build();
backendComponent.inject(this);
backendService.call();
System.out.println("User: " + user);
}
public static void main(String[] args) {
new TestApp().testServer();
}
}
User: null
ServerUrl: http://www.google.com
User: User [firstName=John, lastName=Doe]
你的问题的原因是匕首的工作方式。它只在指定为Inject方法参数的类上注入用@Inject注释的字段。因此,将不会注入后端服务中带有@Inject注释的任何内容
public class TestApp {
@Inject <-- this is injected
User user;
@Inject <-- this is injected
BackendService backendService; <-- Nothing inside this class will be injected
另一种解决方案是在组件内部为后端服务定义注入方法,但传递组件对象时会变得混乱。问题的原因是dagger的工作方式。它只在指定为Inject方法参数的类上注入用@Inject注释的字段。因此,将不会注入后端服务中带有@Inject注释的任何内容
public class TestApp {
@Inject <-- this is injected
User user;
@Inject <-- this is injected
BackendService backendService; <-- Nothing inside this class will be injected
另一个解决方案是在组件内部为后端服务定义一个注入方法,但传递组件对象时会变得混乱。请提供后端组件的代码。@Jacob我现在添加了后端组件代码,请检查。请提供后端组件的代码。@Jacob我现在添加了后端组件代码,请检查。