我正在尝试使用匕首进行野外注射,虽然构造注射工作非常好,但我不知道注射时有什么问题。可能是我做错了。我正在添加代码片段。我在engine.start()上得到空指针异常,因为没有提供引擎依赖。它类似于A-> B-> C依赖性,其中A-> B进料但B-> C不进料。它很久我无法解决。
package com.raghav.java.car;
import javax.inject.Inject;
public class App
{
@Inject
Car car;
App() {
DaggerCarComponent.create().inject(this);
}
public static void main( String[] args )
{
App app = new App();
app.perform();
}
private void perform() {
car.run();
}
}
public interface Engine {
void start();
}
class FordEngine implements Engine {
public void start() {
System.out.println("Engine started -- Vroom Vroom");
}
}
public interface Car {
void run();
}
class MarutiCar implements Car {
@Inject
Engine engine;
public void run() {
engine.start();
System.out.println("WOW!! Maruti Running ");
}
}
@Singleton
@Component(modules = {CarModule.class})
public interface CarComponent {
void inject(App app);
}
@Module
class CarModule {
@Singleton
@Provides
public Car provideCar() {
return new MarutiCar();
}
@Singleton
@Provides
public Engine provideEngine() {
return new FordEngine();
}
}
答案 0 :(得分:0)
如果你想进行嵌套注入,你需要使用构造函数注入,否则不会自动发生,因为当你提供Dagger样式的依赖(通过模块中的构造函数注入或参数注入)时,dagger不知道这一点。改变你的课程如下:
像这样更改MarutiCar
:
class MarutiCar implements Car {
Engine engine;
@Inject
public MarutiCar(Engine engine)
{
this.engine = engine;
}
public void run() {
engine.start();
System.out.println("WOW!! Maruti Running ");
}
}
和你的FordEngine
类是这样的:
class FordEngine implements Engine {
@inject
public FordEngine()
{
}
public void start() {
System.out.println("Engine started -- Vroom Vroom");
}
}
然后更改您的CarModule
,如下所示:
@Module
class CarModule {
@Singleton
@Provides
public Car provideCar(MarutiCar marutiCar) {
return marutiCar;
}
@Singleton
@Provides
public Engine provideEngine(FordEngine fordEngine) {
return fordEngine;
}
}
更新:不属于其自身创造的类别的D W W IN IN IN IN F F F F F F F F F F F F F F F
您正在自己创建MarutiCar实例,您如何期待匕首知道它需要什么?你可以在那个类中开始一个新的匕首创造链来实现这个,这是一个奇怪的事情。
你需要通过构造函数或模块方法参数显示依赖关系来告诉dagger你需要什么,以便dagger实例化它们以便你知道它们需要什么。 dagger没有提供嵌套的依赖注入字段,因为它没有创建它们所以它不知道它们的依赖关系,除非你启动另一个匕首创建链,就像你在App
类中所做的那样。
还有另一种方法,如果你不想使用构造函数注入,我只为你显示这个Car和MarutiCar
类:
@Module
class CarModule {
@Singleton
@Provides
public Car provideCar(Engine engine) {
MarutiCar marutiCar = new MarutiCar(engine);
}
@Singleton
@Provides
public Engine provideEngine(FordEngine fordEngine) {
return fordEngine;
}
}
并且MarutiCar类就像这样(不需要@inject)
class MarutiCar implements Car {
Engine engine;
public MarutiCar(Engine engine)
{
this.engine = engine;
}
public void run() {
engine.start();
System.out.println("WOW!! Maruti Running ");
}
}