Awesome
Toothpick (a.k.a T.P. like a teepee)
<table style="border:0px"> <tr style="border:0px"> <td width="125" style="border:0px"> <img src="https://raw.github.com/stephanenicolas/toothpick/master/assets/logo.jpg" width="125px" /> </td> <td style="border:0px"> <a alt="Build Status" href="https://travis-ci.org/stephanenicolas/toothpick"> <img src="https://travis-ci.org/stephanenicolas/toothpick.svg?branch=master"/></a> <br/> <a alt="Coverage Status" href="https://coveralls.io/github/stephanenicolas/toothpick?branch=master"> <img src="https://coveralls.io/repos/github/stephanenicolas/toothpick/badge.svg?branch=master"/></a> <br/> <a alt="License" href="https://raw.githubusercontent.com/stephanenicolas/toothpick/master/LICENSE"> <img src="http://img.shields.io/:license-apache-blue.svg"/></a> <br/> <a alt="Maven Central" href="http://search.maven.org/#search|gav|1|g:'com.github.stephanenicolas.toothpick'%20AND%20a:'toothpick'"> <img src="https://img.shields.io/maven-central/v/com.github.stephanenicolas.toothpick/toothpick.svg?style=flat"/></a> <br/> </td> <td style="border:0px"> <a alt="Android Dev Weekly" href="http://androidweekly.net/issues/issue-207"> <img src="https://img.shields.io/badge/Android%20Weekly-%23207-brightgreen.svg"/></a> <br/> <a alt="Android Arsenal" href="http://android-arsenal.com/details/1/3646"> <img src="https://img.shields.io/badge/Android%20Arsenal-Toothpick-brightgreen.svg?style=flat"/></a> <br/> <a alt="Incap: isolating" href="https://github.com/gradle/gradle/blob/master/subprojects/docs/src/docs/userguide/java_plugin.adoc#isolating-annotation-processors"> <img src="https://img.shields.io/badge/incap-isolating-4AC31D?style=flat"/></a> </td> <td> <a href="https://github.com/stephanenicolas/toothpick/wiki"> Visit TP wiki ! </a> </td> </tr> </table>What is Toothpick ?
Toothpick is a scope tree based Dependency Injection (DI) library for Java.
It is a full-featured, runtime based, but reflection free, implementation of JSR 330.
What does Toothpick offer ?
//a typical Toothpick scope tree during the execution of an Android app.
@ApplicationScope
/ | \
/ | \
/ | \
@ViewModelScope | Service 2
/ |
/ Service 1
/
@Activity1Scope
/
/
Activity 1
/ \
/ Fragment 2
/
Fragment 1
Scopes offer to compartmentalize memory during the runtime of an app and prevent memory leaks. All dependencies created via Toothpick, and available for injections, will be fully garbage collected when this scope is closed. To learn more about scopes, read TP wiki.
Toothpick is :
- pure java (Android support is provided: "Smoothie", Kotlin support is provided by "KTP")
- fast, it doesn't use reflection but annotation processing
- TP supports incremental annotation processing (isolating).
- simple, flexible, extensible & powerful, robust & tested
- thread safe
- documented & Open Source
- scope safe : it enforces leak free apps
- test oriented : it makes tests easier
- is a candidate of choice for Android or any other context based framework (such as web containers)
Examples
This is the example:
Setup
The latest version of TP is provided by a badge at the top of this page.
For Android :
#android setup using gradle 5.5.1
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.x'
}
}
...
#for java
dependencies {
implementation 'com.github.stephanenicolas.toothpick:toothpick-runtime:3.x'
// and for android -> implementation 'com.github.stephanenicolas.toothpick:smoothie-androidx:3.x'
annotationProcessor 'com.github.stephanenicolas.toothpick:toothpick-compiler:3.x'
//highly recommended
testImplementation 'com.github.stephanenicolas.toothpick:toothpick-testing-junit5:3.x'
testImplementation 'mockito or easymock'
}
#for kotlin
dependencies {
implementation 'com.github.stephanenicolas.toothpick:ktp:3.x'
kapt 'com.github.stephanenicolas.toothpick:toothpick-compiler:3.x'
//highly recommended
testImplementation 'com.github.stephanenicolas.toothpick:toothpick-testing-junit5:3.x'
testImplementation 'mockito or easymock'
}
For java:
<!--java setup with maven -->
<dependencies>
<dependency>
<groupId>com.github.stephanenicolas.toothpick</groupId>
<artifactId>toothpick-compiler</artifactId>
<version>3.x</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.github.stephanenicolas.toothpick</groupId>
<artifactId>toothpick-runtime</artifactId>
<version>3.x</version>
<scope>compile</scope>
</dependency>
<!-- highly recommended-->
<dependency>
<groupId>com.github.stephanenicolas.toothpick</groupId>
<artifactId>toothpick-testing</artifactId>
<version>3.x</version>
<scope>test</scope>
</dependency>
<dependency>
<easymock or mockito>
</dependency>
</dependencies>
Support
TP is actively maintained and we provide support to questions via the Toothpick-di tag on Stack Over Flow.
Ask questions on Stack Over Flow while keeping the GitHub issue board for real issues. Thx in advance !
Talks & Articles
- A Dependency Injection Showdown - Pro Android Dev article
- Toothpick 3 — a hidden gem in the DI world - Medium article
- How I learned to love unit testing with Toothpick - Groupon's medium blog article
- Droidcon, Boston 2017 - Slides & Video
- Migrating off RoboGuice 3 (to Toothpick) - Part 1 & Part 2
- Mobius, Saint Petersburg 2017 - Slides
- Mobius, Saint Petersburg 2017 - DI frameworks & Internals Slides
- Android Makers, Paris 2017 - Slides & Video
- DroidCon, Kaigi 2017 - Slides
- Andevcon, San Francisco 2016 - Slides
- DroidCon, Krakow 2016 - TP Vs Dagger 2 Talk from Danny Preussler slides
- Mobile Era, Oslo 2016 - Slides
- Droidcon, Berlin 2016 - Slides - Sketch notes
- Android Leaks 2016 - podcast in French
- DevFest Belgium 2016 - video in French
- DevFest Siberia 2017 - video in Russian
- DevFest North 2017 - video in Russian
- Toothpick: a simple DI for Android development (Russian)
Wanna know more ?
Visit Toothpick's wiki !
Alternative Dependency Injection (DI) engines for Android
RoboGuice(deprecated)Dagger 1(deprecated)- Dagger 2
- transfuse
- lightsaber
tiger(deprecated)- feather
- proton
- koin
- Kodein-DI
Libs / Apps using TP 2
- Okuki is a simple, hierarchical navigation bus and back stack for Android, with optional Rx bindings, and Toothpick DI integration.
- KotlinWeather is a simple example of using ToothPick with Kotlin and gradle integration using kapt.
Credits
TP 1 & 3 have been developped by Stephane Nicolas and Daniel Molinero Reguera. Most of the effort on version 2 has been actively supported by Groupon. Thanks for this awesome OSS commitment !