1. 简介
Dagger2是一个依赖注入框架,butterknife也是一个依赖注入框架。不过没有Dagger2好用,Dagger2的主要作用,就是对象的管理,其目的是为了降低程序耦合。
2. 注解介绍
@Inject :
这个注解有两种使用方式,一种是注解类的构造函数,一种是注解类的成员变量。
@Provides
这个注解的功能就是标注提供被注入的对象的方法,是为了弥补@Inject 注解出现的。
主要的作用是为了弥补@Inject注解的不足,因为@Inject在提供注入对象的时候必须要在构造函数上注解,那么这就存在局限。@Provides就是为了弥补这种局限的。
@Module
这个注解在我看来就是提供一个场所,用来生成被注入的对象的场所,由上文可以知道我们可以用过两种方式提供被注入的对象,@Inject 标识构造函数,@Provides 标识提供注入对象的方法。但是如果在整个项目中任意位置这么写的话,我想这个工作量可能会很巨大,所以就出现了Module注解,一是为了整理归拢当前需要的提供的注入对象,二是便于维护,当前module内的可以互相提供。
@Component
这个注解的功能就是来将提供的对象注入的指定的类中, 它可以知道它能从哪些地方来获取被注入的对象,它有一个方法能够调用当前类的注入工具去注入对象。更具体的说它的作用是将提供注入对象的场所和要去注入的类建立连接。
@Singleton
就是单例模式时使用的注解,被@singleton标记的@Provides方法的返回值是单例的
3. 添加依赖
compile 'com.google.dagger:dagger:2.22.1'
annotationProcessor 'com.google.dagger:dagger-compiler:2.22.1'
4. 编写IService 接口
package com.xl.look.core;
public interface IService {
void init() throws Exception;
}
5. 编写你需要的接口并继承IService接口
package com.xl.look.api;
import com.xl.look.core.IService;
public interface XlService extends IService {
void run();
}
6. 编写实现类
package com.xl.look.api;
import com.xl.filesync.rpc.XlServiceGrpc;
import javax.inject.Inject;
import javax.inject.Singleton;
@Singleton
public class XlServiceImpl extends XlServiceGrpc.XlServiceImplBase implements XlService {
//有需要注入的对象可以使用@Inject注解
@Inject
IConfigService configService;
//需要带有@Inject注解的构造函数
@Inject
public XlServiceImpl () {
}
@Override
public void init() throws Exception {
}
@Override
public void run() {
}
}
7. 编写Module类
package com.xl.look.core;
import com.xl.look.api.XlServiceImpl ;
import com.xl.look.api.XlService;
import dagger.Module;
import dagger.Provides;
@Module
public class AppModule {
@Provides
XlService provideXlService(XlServiceImpl service) {
return service;
}
}
8. 编写Component类
package com.xl.look.core;
import com.xl.look.api.XlService ;
import dagger.Component;
import javax.inject.Singleton;
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
XlService getXlService ();
}
9. 编译代码
点击Gradle中的build进行编译即可