Skip to content

shuaicj/dinject

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

dinject

A lightweight dependency injector for Java with minimum size about 11KB, generally based on javax-inject.

Get Started

Add in Maven pom:

<dependencies>
    <dependency>
        <groupId>com.github.shuaicj</groupId>
        <artifactId>dinject</artifactId>
        <version>0.0.1</version>
    </dependency>
</dependencies>

<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>

Usage examples:

  1. Java classes with no-arg constructor can be instantiated directly:
class A {}

Dinject dinject = Dinject.create();
A a = dinject.instance(A.class);
  1. Constructor injection:
class A {

    final B b;
    final C c;

    @Inject A(B b, C c) {
        this.b = b;
        this.c = c;
    }
}

class B {}

class C {}

A a = dinject.instance(A.class);
  1. Define singletons:
@Singleton
class A {}
  1. Field injection:
class A {
    @Inject B b;
}

class B {}

A a = dinject.instance(A.class);
  1. Custom instances with @Provides and modules:
class Module {
    @Provides I i() { return new A(); }
}

interface I {}

class A implements I {}

Dinject dinject = Dinject.create(Module.class);
I i = dinject.instance(I.class);
  1. Naming instances with @Named:
class Module {

    @Provides @Named("b1") B b1() { return new B("b1"); }

    @Provides @Named("b2") B b2() { return new B("b2"); }
}

class A {

    final B b;

    @Inject A(@Named("b2") B b) { this.b = b; }
}

class B {

    final String name;

    B(String name) { this.name = name; }
}

A a = dinject.instance(A.class);
B b1 = dinject.instance(B.class, "b1");
B b2 = dinject.instance(B.class, "b2");
  1. Solve circular dependencies or lazy initiation with @Provider:
class A {

    final Provider<B> b;

    @Inject A(Provider<B> b) { this.b = b; }
}

class B {

    final Provider<C> c;

    @Inject B(Provider<C> c) { this.c = c; }
}

class C {

    final Provider<A> a;

    @Inject C(Provider<A> a) { this.a = a; }
}

A a = dinject.instance(A.class);
  1. Init dinject with multiple modules:
class Module1 {
    @Provides A a() { return new A(); }
}

class Module2 {
    @Provides B b() { return new B(); }
}

Dinject dinject = Dinject.create(Module1.class, Module2.class);
  1. Inject dinject itself:
class A {

    final Dinject dinject;

    @Inject A(Dinject dinject) { this.dinject = dinject; }
}

A a = dinject.instance(A.class);

About

A lightweight dependency injector for Java.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages