dagger2所有的用法都在里面了

本demo包含

(1)MVP模式更新view

(2)基本用法

(3)@Named用法和自定义Qualifier

(4)@Singleton和自定义Scope

(5)全局Singleton和当前Activity的Singleton

(6)subcomponent

结合demo查看:

link:http://download.csdn.net/download/liyang_nash/10276077

/*总结:

(1)总的来说,Module就是用来提供主界面Activity @Inject的对象, 提供的方法是provide开头, 并用Provide注解
其实使用Dagger2就说白了就是调用者需要什么实例我就在module中创建什么实例,如果这个实例需要参数,需要什么参数
,我就在mudule给你创建你想要的参数。
(2)什么时候需要构造方法加@Inject, 当@Provide中需要用到这个对象, 且没有调用new 的时候, 就需要加上Inject, 比如:UserStroe
@Provides
public UserManager provideUserManager(ApiService apiService, UserStroe userStroe) {
return new UserManager(userStroe, apiService);
}

apiService对象可以通过这个获取
@Provides//给@Inject UserManager 用的
public ApiService provideApiService() {
return new ApiService(context);
}

那么userStroe, 就只能通过UserStroe类注入的构造方法来获取了
@Inject
public UserStroe(String url) {
Log.d("TAG", "UserStroe: 构造啦" + url);
}

(3)要根据不同构造获取对象的时候, 就需要用到@Name
(4)系统自动生成的DaggerAppComponent 就是一个桥梁, 它将需要的参数, 传递给了module, 然后module可以用这个参数,来初始化
@Inject的对象, 并把这个对象提供出来.
(5)@Dev和@Release是自定义注解, 用来模仿@Named("dev")的, 看栗子Work
(6)SingleTon在三个地方需要注明, 1是provide处, 2是Component处, 3是调用处
(7)@Named是@Qualifier具体实现,@Singleton是@Scope的具体实现;@Scope和@Qualifier类似不同作用注解的关键字
(8)@PerActivity 和 dependencies = SingleComponent.class 用来实现全局的单例
(9)一个Activity只能inject一个Component, 例如, 这个就是MainActivity的AppComponent.
public interface AppComponent {
void inject(MainActivity activity);
}
我如果在下面也写上MainActivity. 那就出错了.
public interface PerActivityComponent {
void inject(LoginActivity activity);
}
(10)@PerActivity 这里面,因为APPSingleComponent提供了APPSingleModule.所以前面的modules不能是APPSingleModule
如下:
@Component(modules = {MyModule.class}, dependencies = APPSingleComponent.class)
public interface PerActivityComponent {
void inject(LoginActivity activity);
}
测试之后效果如下
03-07 15:57:11.715 5726-5726/lynash.com.mydragger2 E/Minikin: addFont failed to create font data/skin/fonts/DroidSansChinese.ttf
03-07 15:57:11.721 5726-5726/lynash.com.mydragger2 E/TAG: ###################APPSingleData a = lynash.com.mydragger2.APPSingle.AppSingleData@2361481f ###################
03-07 15:57:22.995 5726-5726/lynash.com.mydragger2 E/Minikin: addFont failed to create font data/skin/fonts/DroidSansChinese.ttf
03-07 15:57:23.000 5726-5726/lynash.com.mydragger2 E/TAG: ###################APPSingleData b = lynash.com.mydragger2.APPSingle.AppSingleData@2361481f ###################
(11)子component加载.
不需要使用更多的DaggerXXXXComponent对象来创建依赖,仅需要在被依赖Component中增加
XXXComponent getXXComponent(XXXModule) 方法


/*注意事项(重要)分析

1. componet 的 inject 方法接收父类型参数,而调用时传入的是子类型对象则无法注入
2. component关联的modules中不能有重复的provide
3. module 的 provide 方法使用了 scope ,那么 component 就必须使用同一个注解
4. module 的 provide 方法没有使用 scope ,那么 component 和 module 是否加注解都无关紧要,可以通过编译
5. component的dependencies与component自身的scope不能相同,即组件之间的scope不同
6. Singleton的组件不能依赖其他scope的组件,只能其他scope的组件依赖Singleton的组件
7. 没有scope的component不能依赖有scope的component
8. 一个component不能同时有多个scope(Subcomponent除外)
9. @Singleton 的生命周期依附于component,同一个module provide singleton ,不同component 也是不一样
10. Component注入的Activity 在其他Component中不能再去注入
11. dagger2是跟着生命周期的绑定Activity(Fragment)onDestory 对象也会销毁
12. 创建实例的方法和引用实例都不能用private修饰*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值