其实很容易知道为什么Dagger依赖注入不支持多态的原因,我们假设需要注入一个Object的对象,而项目中如果有很多@Inject标识的构造方法,这些构造方法生成的对象都是Object的子类对象,那么Dagger就不知道要注入哪一个,就无法编译通过。
我们知道java的多态支持声明一个父类对象,然后实例化一个子类对象赋值给它但是Dagger并不支持这种多态,我们可以写个例子验证下,直接上代码public interface Person { String saySomething();}public class Student implements Person { public String name;...
#
AndroidInject
一个简单的 androd 资源
注入工具,只有一个
类,方便拷贝,用来在平时学习中简化一些操作,减少重复代码量,因此,只适合学习工程
如果需要在工作中使用,可以参考更严谨的视图
注入框架
不
支持绑定继承而来的字段与方法
##使用方法
####绑定资源
@
Injector.Res(R.string.string_1)
String string_1;
@
Injector.Res(R.array.sa_1)
String[] sa;
@
Injector.Res(R.integer.int_1)
int int_1;
@
Injector.Res(R.array.ia_1)
int[] ia;
@
Injector.Res(R.bool.bool_1)
boolean bool_1;
####绑定事件
//普通View
@
Injector.View(R.id.btn_1)
@AINoTitle:
类注解, 只适用于Activity(需继承于AIActivity), 设置Activity不显示Title
@AIFullScreen:
类注解, 只适用于Activity(需继承于AIActivity), 设置Activity全屏
@AILayout:
类注解
value[int]: 用于设置该Activity的布局 ---- setContentView(resId);
@AIView: 属性注解
id[int]: 用于绑定控件 ---- findViewById(resId);(default identifier[R.id.{field name}] if did not set id)
clickMethod[String]: 用于设置控件点击事件的回调方法, 可选, 方法名称任意, 参数
必须为(View view)
longClickMethod[String]: 用于设置控件长按的回调方法, 可选, 方法名任意, 参数
必须为(View view)
itemClickMethod[String]: 用于设置控件item点击的回调方法, 可选, 方法名任意, 参数
必须为(AdapterView, View, int, long)
itemLongClickMethod[String]: 用于设置控件item长按的回调方法, 可选, 方法名任意, 参数
必须为(AdapterView, View, int, long)
@AIBean: 属性注解, 为该属性生成一个对象并
注入, 该对象
必须有个默认的不带参数的构造方法
@AISystemService: 属性注解,为该属性
注入系统服务对象
@AIClick: 方法注解
value[int[], 所要绑定控件的id]: 用于绑定控件点击事件的回调方法, 方法名称任意, 参数
必须为(View view)
@AIItemClick: 方法注解
value[int[], 所要绑定控件的id]: 用于绑定控件item点击事件的回调方法, 方法名称任意, 参数
必须为(AdapterView, View, int, long)
@AILongClick: 方法注解
value[int[], 所要绑定控件的id]: 用于绑定控件长按事件的回调方法, 方法名称任意, 参数
必须为(View view)
@AIItemLongClick: 方法注解
value[int[], 所要绑定控件的id]: 用于绑定控件item长按事件的回调方法, 方法名称任意, 参数
必须为(AdapterView, View, int, long)
@AIScreenSize: 属性注解
用于
注入当前设备的屏幕大小(宽高)
@AIGet: 方法注解
value[String, 所要请求的url]:表示以GET来请求url
connTimeout[int, 连接超时时间]:连接一个url的连接等待时间
soTimeout[int, response返回超时时间]:连接上一个url,获取response的返回等待时间
@AIPost: 方法注解
value[String, 所要请求的url]:表示以Post来请求url
connTimeout[int, 连接超时时间]:连接一个url的连接等待时间
soTimeout[int, response返回超时时间]:连接上一个url,获取response的返回等待时间
@AIParam: 方法参数注解
value[String, 请求的参数别名]:
注入@AIGet或@AIPost注解方法的请求参数
@AINetWorker: 属性注解
注入网络请求服务
@AIUpload: 方法注解
value[String, 所要请求的url]:表示要上传的url,默认用post请求(不需要使用@AIPost注解)
connTimeout[int, 连接超时时间]:连接一个url的连接等待时间
soTimeout[int, response返回超时时间]:连接上一个url,获取response的返回等待时间
注意:使用此注解的方法参数需要包含Collection或其
子类型集合 或者包含File对象 来作为要上传的文件
@Inject
@Inject支持构造函数、方法和字段注解,也可能使用于静态实例成员。可注解成员可以是任意修饰符(private,package-private,protected,public)。注入顺序:构造函数、字段,然后是方法。父类的字段和方法注入优先于子类的字段和方法,同一类中的字段和方法是没有顺序的。
@Inject注解的构造函数可以是无参或多个参数的构造函数。@I...
Dagger除了可以在属性上表示@
Inject注入对象外,还可以在方法上标识,如下所示
然后调用
DaggerMainActivityComponent.create().
inject(this)就可以
注入对象了
public class MainActivity extends AppCompatActivity {
// 这里不用标识
Student student;
dagger与抽象
继承、封装和多态是面向对象的三大特征,这三大特征无一不是围绕着抽象这个词展开的,但在前几篇的例子中,我们的依赖都是具体的类型,比如Computer、CPU、Memory,严重违反了依赖倒置原则:
模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的
总之,我们接下来需要加上抽象的思想,看看dagger怎样处理
现在我们将Co...
3 import
android.annotation.SuppressLint;
4 import
android.app.Activity;
5 import
android.content.Intent;
6 import
android.os.Bundle;
7 import
android...
上一篇博客我们已经带大家简单的吹了一下IoC,实现了Activity中View的布局以及控件的注入,如果你不了解,请参考:Android 进阶 教你打造 Android 中的 IOC 框架 【ViewInject】 (上)。
本篇博客将带大家实现View的事件的注入。
1、目标效果
上篇博客,我们的事件的代码是这么写的:
package com.zhy.zhy_xutils_test;
impo...
依赖倒置原则(DIP Dependency Inverse Principle)
高层组件(抽象)不应该依赖于低层组件(细节),两者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。 其核心思想就是基于接口编程
控制反转(IOC Inverse of Control)
将控制权交向上层组件转移。控制反转是DIP的
具体实现方式。
依赖
注入(DI Dependency ...