Я пытаюсь сделать инъекцию поля с помощью Dagger2. Я понимаю, что мне нужно вызвать инъекцию вручную в случае инъекции метода. Я в первую очередь пытаюсь ввести двигатель для автомобиля. Двигатель определяется во время выполнения и вводится.Dagger2 Основы - Инъекция поля - Не работает
Данные идет как этот
CarInterface
import dagger.Binds;
public interface Car {
public void run();
}
Реализация автомобилей
public class Volkswagen implements Car {
@Inject
public Engine engine;
public void run() {
// TODO Auto-generated method stub
System.out.println("About to Run");
engine.start();
}
}
Интерфейс двигателя
public interface Engine {
public String start();
}
Реализация двигателя
public class Ferrari4Cylinder implements Engine{
@Override
public String start() {
// TODO Auto-generated method stub
return "Ignition----Vroom-- Vroom-- Sweet Purring Sound";
}
}
Модуль автомобиля
public class CarModule{
@Provides @Singleton
Car provideCar(){
return new Volkswagen();
}
}
Модуль двигателя
@Module
public class EngineModule {
@Provides @Singleton
public Engine provideEngine(){
return new Ferrari4Cylinder();
}
}
компонентов класса
@Singleton
@Component(modules = {CarModule.class, EngineModule.class})
public interface MyCarComponent {
public Car provideCar();
void inject(Car car);
}
Главный метод
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
MyCarComponent carComponent= DaggerMyCarComponent.builder().build();
Car car = carComponent.provideCar();
carComponent.inject(car);
car.run();
}
}
По какой-то причине: Метод Car.run() всегда возвращает значение null, так как Двигатель никогда не был введен в эксплуатацию. Исключение в теме "main" java.lang.NullPointerException
Может ли кто-нибудь помочь в том, что здесь происходит?
Обновление 9/02/2016: Я выяснил, что следующее изменение компонента для указания фактической реализации работает, как показано ниже. Не знаю, почему другого нет, но это помогло мне продвинуться по этому вопросу.
@Singleton
@Component(modules = {CarModule.class, EngineModule.class})
public interface MyCarComponent {
public Volkswagen provideCar();
void inject(Volkswagen car);
}
Надеюсь, что это поможет людям, которые пытаются решить проблемы с полевыми инъекциями в кинжале.
Этот код отлично работает, если интерфейс CAR нет. Я попадаю в ошибку, или я пропускаю нотацию? –
Я все еще не могу понять, почему он не работает. Я сделал фиктивный проект так же, как вы, и полевая инъекция не работает в этом проекте. Я внес изменения, которые вы предложили в последних комментариях, чтобы изменить их на Volkwagen, но все же я не могу успешно запустить проект. Он по-прежнему содержит исключение с помощью исключения из нулевого указателя. –
Вы могли понять это? Если вы можете отправить мне код, который я могу посмотреть? –