Links & DependenciesDriver.javaPetrolEngine.javaDieselEngine.javaPetrolEngineModule.javaDieselEngineModule.javaRims.javaTires.javaWheelsModule.javaRemote.javaCar.javaEngine.javaWheels.javaMainActivity.javaCarComponent.java
Dagger 2 dependencies:
package com.codinginflow.dagger2example.car; import javax.inject.Inject; import javax.inject.Singleton; @Singleton public class Driver { @Inject public Driver() { } }
package com.codinginflow.dagger2example.car; import android.util.Log; import javax.inject.Inject; import javax.inject.Named; public class PetrolEngine implements Engine { private static final String TAG = "Car"; private int horsePower; private int engineCapacity; @Inject public PetrolEngine(@Named("horse power") int horsePower, @Named("engine capacity") int engineCapacity) { this.horsePower = horsePower; this.engineCapacity = engineCapacity; } @Override public void start() { Log.d(TAG, "Petrol engine started. " + "\nHorsepower: " + horsePower + "\nEngine capacity: " + engineCapacity); } }
package com.codinginflow.dagger2example.car; import android.util.Log; import javax.inject.Inject; public class DieselEngine implements Engine { private static final String TAG = "Car"; private int horsePower; @Inject public DieselEngine(int horsePower) { this.horsePower = horsePower; } @Override public void start() { Log.d(TAG, "Diesel engine started. Horsepower: " + horsePower); } }
package com.codinginflow.dagger2example.dagger; import com.codinginflow.dagger2example.car.Engine; import com.codinginflow.dagger2example.car.PetrolEngine; import dagger.Binds; import dagger.Module; @Module public abstract class PetrolEngineModule { @Binds abstract Engine bindEngine(PetrolEngine engine); }
package com.codinginflow.dagger2example.dagger; import com.codinginflow.dagger2example.car.DieselEngine; import com.codinginflow.dagger2example.car.Engine; import dagger.Module; import dagger.Provides; @Module public class DieselEngineModule { private int horsePower; public DieselEngineModule(int horsePower) { this.horsePower = horsePower; } @Provides int provideHorsePower() { return horsePower; } @Provides Engine provideEngine(DieselEngine engine) { return engine; } }
package com.codinginflow.dagger2example.car; public class Rims { //we don't own this class so we can't annotate it with @Inject }
package com.codinginflow.dagger2example.car; import android.util.Log; public class Tires { //we don't own this class so we can't annotate it with @Inject private static final String TAG = "Car"; public void inflate() { Log.d(TAG, "Tires inflated"); } }
package com.codinginflow.dagger2example.dagger; import com.codinginflow.dagger2example.car.Rims; import com.codinginflow.dagger2example.car.Tires; import com.codinginflow.dagger2example.car.Wheels; import dagger.Module; import dagger.Provides; @Module public abstract class WheelsModule { @Provides static Rims provideRims() { return new Rims(); } @Provides static Tires provideTires() { Tires tires = new Tires(); tires.inflate(); return tires; } @Provides static Wheels provideWheels(Rims rims, Tires tires) { return new Wheels(rims, tires); } }
package com.codinginflow.dagger2example.car; import android.util.Log; import javax.inject.Inject; public class Remote { private static final String TAG = "Car"; @Inject public Remote() { } public void setListener(Car car) { Log.d(TAG, "Remote connected"); } }
package com.codinginflow.dagger2example.car; import android.util.Log; import javax.inject.Inject; public class Car { private static final String TAG = "Car"; private Driver driver; private Engine engine; private Wheels wheels; @Inject public Car(Driver driver, Engine engine, Wheels wheels) { this.driver = driver; this.engine = engine; this.wheels = wheels; } @Inject public void enableRemote(Remote remote) { remote.setListener(this); } public void drive() { engine.start(); Log.d(TAG, driver + " drives " + this); } }
package com.codinginflow.dagger2example.car; public interface Engine { void start(); }
package com.codinginflow.dagger2example.car; public class Wheels { //we don't own this class so we can't annotate it with @Inject private Rims rims; private Tires tires; public Wheels(Rims rims, Tires tires) { this.rims = rims; this.tires = tires; } }
package com.codinginflow.dagger2example; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import com.codinginflow.dagger2example.car.Car; import com.codinginflow.dagger2example.dagger.CarComponent; import com.codinginflow.dagger2example.dagger.DaggerCarComponent; import javax.inject.Inject; public class MainActivity extends AppCompatActivity { @Inject Car car1, car2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); CarComponent component = DaggerCarComponent.builder() .horsePower(150) .engineCapacity(1400) .build(); component.inject(this); car1.drive(); car2.drive(); } }
package com.codinginflow.dagger2example.dagger; import com.codinginflow.dagger2example.MainActivity; import com.codinginflow.dagger2example.car.Car; import javax.inject.Named; import javax.inject.Singleton; import dagger.BindsInstance; import dagger.Component; @Singleton @Component(modules = {WheelsModule.class, PetrolEngineModule.class}) public interface CarComponent { Car getCar(); void inject(MainActivity mainActivity); @Component.Builder interface Builder { @BindsInstance Builder horsePower(@Named("horse power") int horsePower); @BindsInstance Builder engineCapacity(@Named("engine capacity") int engineCapacity); CarComponent build(); } }