├── compiler ├── .gitignore ├── src │ ├── main │ │ ├── resources │ │ │ └── META-INF │ │ │ │ └── services │ │ │ │ └── javax.annotation.processing.Processor │ │ └── java │ │ │ └── com │ │ │ └── wokdsem │ │ │ └── kinject │ │ │ └── codegen │ │ │ ├── ProcessorException.java │ │ │ ├── domains │ │ │ ├── Dependency.java │ │ │ ├── Reference.java │ │ │ ├── Include.java │ │ │ ├── Graph.java │ │ │ ├── Module.java │ │ │ └── Provide.java │ │ │ ├── MapperNames.java │ │ │ ├── ModuleProcessor.java │ │ │ ├── CodeGen.java │ │ │ ├── ModulesRecover.java │ │ │ ├── ModuleAdapterSpec.java │ │ │ ├── GraphBuilder.java │ │ │ ├── MethodsRecover.java │ │ │ └── ModuleMapperSpec.java │ └── test │ │ └── java │ │ └── com │ │ └── wokdsem │ │ └── kinject │ │ └── codegen │ │ ├── ModuleRecoverTest.java │ │ └── GraphBuilderTest.java └── build.gradle ├── kinject ├── .gitignore ├── src │ ├── main │ │ └── java │ │ │ └── com │ │ │ └── wokdsem │ │ │ └── kinject │ │ │ ├── core │ │ │ ├── Provider.java │ │ │ ├── binder │ │ │ │ ├── Binder.java │ │ │ │ ├── SimpleBinder.java │ │ │ │ ├── SingletonBinder.java │ │ │ │ └── WeakSingletonBinder.java │ │ │ ├── KinjectValues.java │ │ │ ├── Injector.java │ │ │ ├── ModuleMapper.java │ │ │ ├── KinjectRunner.java │ │ │ ├── Blocker.java │ │ │ └── KinjectEngine.java │ │ │ ├── annotations │ │ │ ├── Includes.java │ │ │ ├── Module.java │ │ │ ├── Named.java │ │ │ └── Provides.java │ │ │ └── Kinject.java │ └── test │ │ └── java │ │ └── com.wokdsem.kinject │ │ ├── KinjectTest.java │ │ └── core │ │ └── KinjectRunnerTest.java └── build.gradle ├── examples ├── coffee │ ├── .gitignore │ ├── src │ │ └── main │ │ │ └── java │ │ │ └── com │ │ │ └── wokdsem │ │ │ └── examples │ │ │ ├── Pump.java │ │ │ ├── Heater.java │ │ │ ├── ElectricalHeater.java │ │ │ ├── Thermosiphon.java │ │ │ ├── modules │ │ │ ├── HeaterModule.java │ │ │ └── CoffeeMakerModule.java │ │ │ └── CoffeeMaker.java │ └── build.gradle └── android-simple │ ├── proguard-rules.pro │ ├── .gitignore │ ├── src │ └── main │ │ ├── res │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ ├── values │ │ │ ├── strings.xml │ │ │ ├── dimens.xml │ │ │ ├── colors.xml │ │ │ └── styles.xml │ │ ├── values-v21 │ │ │ └── styles.xml │ │ └── layout │ │ │ └── activity_main.xml │ │ ├── java │ │ └── com │ │ │ └── wokdsem │ │ │ └── examples │ │ │ ├── tools │ │ │ ├── Logger.java │ │ │ └── Display.java │ │ │ ├── DemoValues.java │ │ │ ├── DemoApplication.java │ │ │ ├── ui │ │ │ ├── BaseActivity.java │ │ │ └── HomeActivity.java │ │ │ └── modules │ │ │ ├── AppModule.java │ │ │ └── ToolModule.java │ │ └── AndroidManifest.xml │ └── build.gradle ├── gradle.properties ├── settings.gradle ├── .gitignore ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── CHANGELOG.md ├── README.md ├── gradlew.bat ├── gradlew └── LICENSE /compiler/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /kinject/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /examples/coffee/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /examples/android-simple/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | VERSION_NAME = 1.3.0 2 | -------------------------------------------------------------------------------- /examples/android-simple/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':kinject', ':compiler', 'examples:android-simple', 'examples:coffee' 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | .idea 3 | /local.properties 4 | .DS_Store 5 | /build 6 | /captures 7 | *.iml 8 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Wokdsem/Kinject/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /compiler/src/main/resources/META-INF/services/javax.annotation.processing.Processor: -------------------------------------------------------------------------------- 1 | com.wokdsem.kinject.codegen.ModuleProcessor 2 | -------------------------------------------------------------------------------- /examples/coffee/src/main/java/com/wokdsem/examples/Pump.java: -------------------------------------------------------------------------------- 1 | package com.wokdsem.examples; 2 | 3 | public interface Pump { 4 | 5 | void pump(); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /kinject/src/main/java/com/wokdsem/kinject/core/Provider.java: -------------------------------------------------------------------------------- 1 | package com.wokdsem.kinject.core; 2 | 3 | public interface Provider { 4 | 5 | T provide(); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /examples/android-simple/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Wokdsem/Kinject/HEAD/examples/android-simple/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /examples/android-simple/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Wokdsem/Kinject/HEAD/examples/android-simple/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /examples/android-simple/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Wokdsem/Kinject/HEAD/examples/android-simple/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /examples/android-simple/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Wokdsem/Kinject/HEAD/examples/android-simple/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /kinject/src/main/java/com/wokdsem/kinject/core/binder/Binder.java: -------------------------------------------------------------------------------- 1 | package com.wokdsem.kinject.core.binder; 2 | 3 | public interface Binder { 4 | 5 | T bind(); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /examples/android-simple/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Wokdsem/Kinject/HEAD/examples/android-simple/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /kinject/src/main/java/com/wokdsem/kinject/core/KinjectValues.java: -------------------------------------------------------------------------------- 1 | package com.wokdsem.kinject.core; 2 | 3 | public interface KinjectValues { 4 | 5 | String DEFAULT_NAMED = ""; 6 | 7 | } 8 | -------------------------------------------------------------------------------- /examples/android-simple/src/main/java/com/wokdsem/examples/tools/Logger.java: -------------------------------------------------------------------------------- 1 | package com.wokdsem.examples.tools; 2 | 3 | public interface Logger { 4 | 5 | void log(String msg); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /examples/android-simple/src/main/java/com/wokdsem/examples/DemoValues.java: -------------------------------------------------------------------------------- 1 | package com.wokdsem.examples; 2 | 3 | public interface DemoValues { 4 | 5 | String APP_CONTEXT = "AppContext"; 6 | 7 | } 8 | -------------------------------------------------------------------------------- /examples/android-simple/src/main/java/com/wokdsem/examples/tools/Display.java: -------------------------------------------------------------------------------- 1 | package com.wokdsem.examples.tools; 2 | 3 | public interface Display { 4 | 5 | void showMessage(String msg); 6 | 7 | } -------------------------------------------------------------------------------- /examples/android-simple/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Android-simple 3 | Settings 4 | 5 | -------------------------------------------------------------------------------- /examples/coffee/src/main/java/com/wokdsem/examples/Heater.java: -------------------------------------------------------------------------------- 1 | package com.wokdsem.examples; 2 | 3 | public interface Heater { 4 | 5 | void heat(); 6 | 7 | boolean isHot(); 8 | 9 | } 10 | -------------------------------------------------------------------------------- /kinject/src/main/java/com/wokdsem/kinject/core/Injector.java: -------------------------------------------------------------------------------- 1 | package com.wokdsem.kinject.core; 2 | 3 | public interface Injector { 4 | 5 | T inject(Class tClass, String named); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /examples/coffee/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { id "net.ltgt.apt" version "0.9" } 2 | apply plugin: 'java' 3 | apply plugin: 'idea' 4 | 5 | dependencies { 6 | compile project(':kinject') 7 | apt project(':compiler') 8 | } -------------------------------------------------------------------------------- /examples/android-simple/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 16dp 3 | 16dp 4 | 16dp 5 | 6 | -------------------------------------------------------------------------------- /examples/android-simple/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /kinject/src/main/java/com/wokdsem/kinject/annotations/Includes.java: -------------------------------------------------------------------------------- 1 | package com.wokdsem.kinject.annotations; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Target; 5 | 6 | @Target(ElementType.METHOD) 7 | public @interface Includes { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Mar 03 17:39:24 CET 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip 7 | -------------------------------------------------------------------------------- /kinject/src/main/java/com/wokdsem/kinject/core/ModuleMapper.java: -------------------------------------------------------------------------------- 1 | package com.wokdsem.kinject.core; 2 | 3 | import com.wokdsem.kinject.core.binder.Binder; 4 | 5 | public interface ModuleMapper { 6 | 7 | Binder buildBinder(Class tClass, String named, Injector injector); 8 | 9 | } 10 | -------------------------------------------------------------------------------- /compiler/src/main/java/com/wokdsem/kinject/codegen/ProcessorException.java: -------------------------------------------------------------------------------- 1 | package com.wokdsem.kinject.codegen; 2 | 3 | class ProcessorException extends Exception { 4 | 5 | ProcessorException(String message, Object... args) { 6 | super(String.format(message, args)); 7 | } 8 | 9 | } 10 | -------------------------------------------------------------------------------- /kinject/src/main/java/com/wokdsem/kinject/annotations/Module.java: -------------------------------------------------------------------------------- 1 | package com.wokdsem.kinject.annotations; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Target; 5 | 6 | @Target(ElementType.TYPE) 7 | public @interface Module { 8 | 9 | boolean completed() default false; 10 | 11 | } 12 | -------------------------------------------------------------------------------- /kinject/src/main/java/com/wokdsem/kinject/annotations/Named.java: -------------------------------------------------------------------------------- 1 | package com.wokdsem.kinject.annotations; 2 | 3 | import com.wokdsem.kinject.core.KinjectValues; 4 | 5 | import java.lang.annotation.ElementType; 6 | import java.lang.annotation.Target; 7 | 8 | @Target(ElementType.PARAMETER) 9 | public @interface Named { 10 | 11 | String value() default KinjectValues.DEFAULT_NAMED; 12 | 13 | } 14 | -------------------------------------------------------------------------------- /compiler/src/main/java/com/wokdsem/kinject/codegen/domains/Dependency.java: -------------------------------------------------------------------------------- 1 | package com.wokdsem.kinject.codegen.domains; 2 | 3 | public class Dependency { 4 | 5 | public final String canonicalClassName; 6 | public final String named; 7 | 8 | public Dependency(String canonicalClassName, String named) { 9 | this.canonicalClassName = canonicalClassName; 10 | this.named = named; 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /examples/coffee/src/main/java/com/wokdsem/examples/ElectricalHeater.java: -------------------------------------------------------------------------------- 1 | package com.wokdsem.examples; 2 | 3 | public class ElectricalHeater implements Heater { 4 | 5 | private boolean isHot; 6 | 7 | @Override 8 | public void heat() { 9 | isHot = true; 10 | System.out.println("~~~ Heating ~~~"); 11 | } 12 | 13 | @Override 14 | public boolean isHot() { 15 | return isHot; 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /compiler/src/main/java/com/wokdsem/kinject/codegen/domains/Reference.java: -------------------------------------------------------------------------------- 1 | package com.wokdsem.kinject.codegen.domains; 2 | 3 | public class Reference { 4 | 5 | public final String canonicalModuleName; 6 | public final String method; 7 | 8 | public Reference(String canonicalModuleName, String method) { 9 | this.canonicalModuleName = canonicalModuleName; 10 | this.method = method; 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /examples/coffee/src/main/java/com/wokdsem/examples/Thermosiphon.java: -------------------------------------------------------------------------------- 1 | package com.wokdsem.examples; 2 | 3 | public class Thermosiphon implements Pump { 4 | 5 | private final Heater heater; 6 | 7 | public Thermosiphon(Heater heater) { 8 | this.heater = heater; 9 | } 10 | 11 | @Override 12 | public void pump() { 13 | if (heater.isHot()) System.out.println("=> => pumping => =>"); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /compiler/src/main/java/com/wokdsem/kinject/codegen/domains/Include.java: -------------------------------------------------------------------------------- 1 | package com.wokdsem.kinject.codegen.domains; 2 | 3 | public class Include { 4 | 5 | public final String canonicalModuleName; 6 | public final Reference reference; 7 | 8 | public Include(String canonicalModuleName, Reference reference) { 9 | this.canonicalModuleName = canonicalModuleName; 10 | this.reference = reference; 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /examples/android-simple/src/main/res/values-v21/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /kinject/src/main/java/com/wokdsem/kinject/core/binder/SimpleBinder.java: -------------------------------------------------------------------------------- 1 | package com.wokdsem.kinject.core.binder; 2 | 3 | import com.wokdsem.kinject.core.Provider; 4 | 5 | public class SimpleBinder implements Binder { 6 | 7 | private final Provider provider; 8 | 9 | public SimpleBinder(Provider provider) { 10 | this.provider = provider; 11 | } 12 | 13 | @Override 14 | public T bind() { 15 | return provider.provide(); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /kinject/src/main/java/com/wokdsem/kinject/core/KinjectRunner.java: -------------------------------------------------------------------------------- 1 | package com.wokdsem.kinject.core; 2 | 3 | public class KinjectRunner { 4 | 5 | public static Injector initializeInjector(ModuleMapper mapper) { 6 | assertModule(mapper); 7 | return new KinjectEngine(mapper); 8 | } 9 | 10 | private static void assertModule(Object module) { 11 | if (module == null) { 12 | throw new IllegalArgumentException("Non null module allowed to Kinject instantiation."); 13 | } 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /kinject/src/test/java/com.wokdsem.kinject/KinjectTest.java: -------------------------------------------------------------------------------- 1 | package com.wokdsem.kinject; 2 | 3 | import com.wokdsem.kinject.core.ModuleMapper; 4 | import org.junit.Test; 5 | 6 | import static org.junit.Assert.assertNotNull; 7 | import static org.mockito.Mockito.mock; 8 | 9 | public class KinjectTest { 10 | 11 | @Test 12 | public void instantiate_withMapperModule_kinjectInstance() { 13 | ModuleMapper mapper = mock(ModuleMapper.class); 14 | Kinject kinject = Kinject.instantiate(mapper); 15 | assertNotNull(kinject); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /examples/coffee/src/main/java/com/wokdsem/examples/modules/HeaterModule.java: -------------------------------------------------------------------------------- 1 | package com.wokdsem.examples.modules; 2 | 3 | import com.wokdsem.examples.ElectricalHeater; 4 | import com.wokdsem.examples.Heater; 5 | import com.wokdsem.kinject.annotations.Module; 6 | import com.wokdsem.kinject.annotations.Provides; 7 | 8 | import static com.wokdsem.kinject.annotations.Provides.Scope.SINGLETON; 9 | 10 | @Module 11 | class HeaterModule { 12 | 13 | @Provides(scope = SINGLETON) 14 | Heater provideHeater() { 15 | return new ElectricalHeater(); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /compiler/src/main/java/com/wokdsem/kinject/codegen/domains/Graph.java: -------------------------------------------------------------------------------- 1 | package com.wokdsem.kinject.codegen.domains; 2 | 3 | import java.util.Collection; 4 | 5 | public class Graph { 6 | 7 | public final String canonicalModuleName; 8 | public final Collection includes; 9 | public final Collection provides; 10 | 11 | public Graph(String canonicalModuleName, Collection includes, Collection provides) { 12 | this.canonicalModuleName = canonicalModuleName; 13 | this.includes = includes; 14 | this.provides = provides; 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /kinject/src/main/java/com/wokdsem/kinject/annotations/Provides.java: -------------------------------------------------------------------------------- 1 | package com.wokdsem.kinject.annotations; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Target; 5 | 6 | import static com.wokdsem.kinject.annotations.Provides.Scope.NONE; 7 | import static com.wokdsem.kinject.core.KinjectValues.DEFAULT_NAMED; 8 | 9 | @Target(ElementType.METHOD) 10 | public @interface Provides { 11 | 12 | String named() default DEFAULT_NAMED; 13 | 14 | Scope scope() default NONE; 15 | 16 | enum Scope { 17 | NONE, 18 | WEAK_SINGLETON, 19 | SINGLETON 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /examples/android-simple/src/main/java/com/wokdsem/examples/DemoApplication.java: -------------------------------------------------------------------------------- 1 | package com.wokdsem.examples; 2 | 3 | import android.app.Application; 4 | import com.wokdsem.examples.modules.AppModule; 5 | import com.wokdsem.kinject.Kinject; 6 | 7 | import static com.wokdsem.examples.modules.AppModuleMapper.from; 8 | 9 | public class DemoApplication extends Application { 10 | 11 | public Kinject injector; 12 | 13 | @Override 14 | public void onCreate() { 15 | super.onCreate(); 16 | AppModule appModule = new AppModule(this); 17 | injector = Kinject.instantiate(from(appModule)); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /kinject/src/main/java/com/wokdsem/kinject/core/binder/SingletonBinder.java: -------------------------------------------------------------------------------- 1 | package com.wokdsem.kinject.core.binder; 2 | 3 | import com.wokdsem.kinject.core.Provider; 4 | 5 | public class SingletonBinder implements Binder { 6 | 7 | private final Provider provider; 8 | private T t; 9 | 10 | public SingletonBinder(Provider provider) { 11 | this.provider = provider; 12 | } 13 | 14 | @Override 15 | public final T bind() { 16 | if (t == null) { 17 | synchronized (this) { 18 | if (t == null) { 19 | t = provider.provide(); 20 | } 21 | } 22 | } 23 | return t; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | ## Kinject 1.3.0 *(2017-08-08) 4 | + New Scopes system 5 | + Added Weak scope 6 | 7 | ## Kinject 1.2.2 *(2017-05-30)* 8 | + Fix: Possible interlock when injecting by first time from on an interrupted thread 9 | 10 | ## Kinject 1.2.1 *(2017-03-04)* 11 | + Internal synchronization improve 12 | 13 | ## Kinject 1.2.0 *(2016-12-06)* 14 | + Kinject instantiation: Init injector from ModuleMapper 15 | 16 | ## Kinject 1.1.0 *(2016-05-10)* 17 | + Added cyclic graph detection on compiler 18 | + Fix: NullPointerException recovering mapper 19 | 20 | ## Kinject 1.0.0 *(2016-02-09)* 21 | + Initial release 22 | 23 | -------------------------------------------------------------------------------- /examples/android-simple/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 13 | 14 |