A lightweight dependency injector for Java with minimum size about 11KB, generally based on javax-inject.
<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>
- Java classes with no-arg constructor can be instantiated directly:
class A {}
Dinject dinject = Dinject.create();
A a = dinject.instance(A.class);
- 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);
- Define singletons:
@Singleton
class A {}
- Field injection:
class A {
@Inject B b;
}
class B {}
A a = dinject.instance(A.class);
- 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);
- 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");
- 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);
- 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);
- Inject
dinject
itself:
class A {
final Dinject dinject;
@Inject A(Dinject dinject) { this.dinject = dinject; }
}
A a = dinject.instance(A.class);