Infuser 轻量级的依赖注入
2017年11月15日
在日常工作中,使用一个类的时候难免会把其他类的对象作为自己内部的变量,由此可见依赖注入的高出现率。在很早的时候就有Dagger开源项目,用过的人都知道它功能的全面性,但也正是由于功能全,在依赖的情况较多时,编译会变的非常慢。在只想创建具有空参或者基本类型参数的类的对象时,有没有更好的轮子呢,答案是肯定的,这时候就可以使用Infuser。
功能
实现
通过
Infuser.bind(this)
绑定当前对象,该方法具有@NonNull
和@UiThread
注解,因此返回值Binder对象不能为空,并且方法是在主线程中执行的。1
2
3
4
5
public static Binder bind(Object object) {
return createBinder(object);
}构建返回值
Binder
,即要查找的自动生成的类的对象,统一实现了Binder接口。1
2
3
4
5
6
7
8
9
10
11
12private static Binder createBinder(Object object) {
Class<?> clazz = object.getClass();
Constructor<? extends Binder> constructor = findBinderConstructorForClass(clazz);
if (constructor == null)
return Binder.BINDER_EMPTY;
try {
return constructor.newInstance(object);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Unable to create new instance " + constructor, e);
}
}创建依赖的对象,获取该对象的
Class
对象,通过Class
对象获取Constructor
对象,最后创建实例。1
2
3
4
5
6
7
8
9
10
11
12
13public class MainActivity_ConstructorBinder implements Binder {
public MainActivity_ConstructorBinder(MainActivity object) {
try {
Class<?> singerClass = Class.forName("com.lxt.simple.Singer");
Constructor<?> constructor = singerClass.getConstructor(double.class,double.class,double.class);
object.singer = (com.lxt.simple.Singer)(constructor.newInstance(20000.0,222222.0,250000.0));
} catch (Exception e){
e.printStackTrace();
}
}
}
链接
在Github上使用。