Dagger
Jesse Wilson from Square A fast dependency injector for Android and Java.
Thursday, November 8, 12
Dagger A fast dependency injector for Android and Java. Thursday, - - PowerPoint PPT Presentation
Jesse Wilson from Square Dagger A fast dependency injector for Android and Java. Thursday, November 8, 12 Introduction Motivation Using Dagger Inside Dagger Wrapping Up Thursday, November 8, 12 Guice Jesse javax.inject Android
Jesse Wilson from Square A fast dependency injector for Android and Java.
Thursday, November 8, 12Introduction Motivation Using Dagger Inside Dagger Wrapping Up
Thursday, November 8, 12Jesse
We’re Hiring! squareup.com/careers
Thursday, November 8, 12Introduction Motivation Using Dagger Inside Dagger Wrapping Up
Thursday, November 8, 12Motivation for Dependency Injection
Dependency Injection Choices
We still love you, Froyo
“I didn’t really expect anyone to use [git] because it’s so hard to use, but that turns out to be its big appeal. No technology can ever be too arcane or complicated for the black t-shirt crowd.” –Linus Torvalds
Thursday, November 8, 12No black t-shirt necessary
Thursday, November 8, 12build time.
dependencies are used & satisfied
CoffeeApp CoffeeMaker Pump Heater Thermosiphon Thursday, November 8, 12Motivation for Dagger
instead of features
Introduction Motivation Using Dagger Inside Dagger Wrapping Up
Thursday, November 8, 12Dagger?
Thursday, November 8, 12DAGger.
Thursday, November 8, 12Directed Acyclic Graph
DAGger.
Thursday, November 8, 12coffee maker heater thermosiphon pump
Thursday, November 8, 12class Thermosiphon implements Pump { private final Heater heater; Thermosiphon(Heater heater) { this.heater = heater; } @Override public void pump() { if (heater.isHot()) { System.out.println("=> => pumping => =>"); } } }
Thursday, November 8, 12class Thermosiphon implements Pump { private final Heater heater; @Inject Thermosiphon(Heater heater) { this.heater = heater; } ... }
Declare Dependencies
Thursday, November 8, 12class CoffeeMaker { @Inject Heater heater; @Inject Pump pump; ... }
Declare Dependencies
Thursday, November 8, 12@Module class DripCoffeeModule { @Provides Heater provideHeater() { return new ElectricHeater(); } @Provides Pump providePump(Thermosiphon pump) { return pump; } }
Satisfy Dependencies
Thursday, November 8, 12class CoffeeApp { public static void main(String[] args) { ObjectGraph objectGraph = ObjectGraph.create(new DripCoffeeModule()); CoffeeMaker coffeeMaker = objectGraph.get(CoffeeMaker.class); coffeeMaker.brew(); } }
Build the Graph
Thursday, November 8, 12Neat features
class GridingCoffeeMaker { @Inject Lazy<Grinder> lazyGrinder; public void brew() { while (needsGrinding()) { // Grinder created once and cached. Grinder grinder = lazyGrinder.get() grinder.grind(); } } }
Lazy<T>
Thursday, November 8, 12@Module( includes = DripCoffeeModule.class, entryPoints = CoffeeMakerTest.class,
) static class TestModule { @Provides @Singleton Heater provideHeater() { return Mockito.mock(Heater.class); } }
Module Overrides
Thursday, November 8, 12@Module class TwitterModule { @Provides(type=SET) SocialApi provideApi() { ... } } @Module class GooglePlusModule { @Provides(type=SET) SocialApi provideApi() { ... } } ... @Inject Set<SocialApi>
Multibindings
Thursday, November 8, 12Introduction Motivation Using Dagger Inside Dagger Wrapping Up
Thursday, November 8, 12Graphs!
Thursday, November 8, 12Creating Graphs
Using Graphs
But how?
“com.squareup.geo.LocationMonitor”
dependencies, like
“com.squareup.otto.Bus”
Thursday, November 8, 12Validation
dagger-compiler
(cc) creative commons from flickr.com/photos/discover-central-california/8010906617 Thursday, November 8, 12Built into javac Foolishly easy to use. Just put
dagger-compiler on your classpath!
javax.annotation.processing
Thursday, November 8, 12It’s a hassle (for us)
... and it’s limited (for you)
... but it’s smoking fast! (for your users)
~5 seconds to ~2 seconds
Thursday, November 8, 12Different Platforms are Different
HotSpot: Java on the Server
Android
devices
GWT
github.com/tbroyer/sheath
Thursday, November 8, 12API Design in the GitHub age
& focused
Thursday, November 8, 12public @interface Inject {} public @interface Named { String value() default ""; } public interface Provider { T get(); } public @interface Qualifier {} public @interface Scope {} public @interface Singleton {}
javax.inject
Thursday, November 8, 12dagger
Thursday, November 8, 12Introduction Motivation Using Dagger Inside Dagger Wrapping Up
Thursday, November 8, 12with Dagger
Guice
Thursday, November 8, 12Dagger
Thursday, November 8, 12square.github.com/dagger
Thursday, November 8, 12Questions?
squareup.com/careers corner.squareup.com swank.ca jwilson@squareup.com
Thursday, November 8, 12