Links & DependenciesExampleApp.javaAndroidManifest.xmlPerActivity.javaAppComponent.javaDriverModule.javaDriver.javaPetrolEngine.javaDieselEngine.javaPetrolEngineModule.javaDieselEngineModule.javaRims.javaTires.javaWheelsModule.javaRemote.javaCar.javaEngine.javaWheels.javaMainActivity.javaActivityComponent.java
Dagger 2 dependencies:
package com.codinginflow.dagger2example; import android.app.Application; import com.codinginflow.dagger2example.dagger.AppComponent; import com.codinginflow.dagger2example.dagger.DaggerAppComponent; public class ExampleApp extends Application { private AppComponent component; @Override public void onCreate() { super.onCreate(); component = DaggerAppComponent.create(); } public AppComponent getAppComponent() { return component; } }
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.codinginflow.dagger2example"> <application android:name=".ExampleApp" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
package com.codinginflow.dagger2example.dagger; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import javax.inject.Scope; import static java.lang.annotation.RetentionPolicy.RUNTIME; @Scope @Documented @Retention(RUNTIME) public @interface PerActivity { }
package com.codinginflow.dagger2example.dagger; import javax.inject.Singleton; import dagger.Component; @Singleton @Component(modules = DriverModule.class) public interface AppComponent { ActivityComponent getActivityComponent(DieselEngineModule dieselEngineModule); }
package com.codinginflow.dagger2example.dagger; import com.codinginflow.dagger2example.car.Driver; import javax.inject.Singleton; import dagger.Module; import dagger.Provides; @Module public abstract class DriverModule { @Provides @Singleton static Driver provideDriver() { return new Driver(); } }
package com.codinginflow.dagger2example.car; public class Driver { //we don't own this class so we can't annotate it with @Inject }
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 com.codinginflow.dagger2example.dagger.PerActivity; import javax.inject.Inject; @PerActivity 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.ActivityComponent; import com.codinginflow.dagger2example.dagger.DieselEngineModule; 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); ActivityComponent component = ((ExampleApp) getApplication()).getAppComponent() .getActivityComponent(new DieselEngineModule(120)); 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 dagger.BindsInstance; import dagger.Component; import dagger.Subcomponent; @PerActivity @Subcomponent(modules = {WheelsModule.class, DieselEngineModule.class}) public interface ActivityComponent { 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); Builder appComponent(AppComponent component); ActivityComponent build(); }*/ }