Dagger2的基本使用

                                                                   Dagger2之基本使用篇
一、使用Dagger2
1、准备工作:
配置apt插件(在build.gradle(Project:xxx)中添加如下代码)

dependencies { classpath 'com.android.tools.build:gradle:2.1.0' 

 //添加apt插件

 classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' 


添加依赖(在build.gradle(Module:app)中添加如下代码)
apply plugin: 'com.android.application' 
 //添加如下代码,应用apt插件 
 apply plugin: 'com.neenbedankt.android-apt'
 ... 
 dependencies
 {
 ...
 compile 'com.google.dagger:dagger:2.4'
 apt 'com.google.dagger:dagger-compiler:2.4'
 //java注解
 compile 'org.glassfish:javax.annotation:10.0-b28' 
2、在需要引入依赖对象的类中加入@Inject注解
public class MainActivity extends AppCompatActivity { 
 @Inject ApiServer mApiServer; 
 @Override 
 protected void onCreate(Bundle savedInstanceState)
 { super.onCreate(savedInstanceState); 
 setContentView(R.layout.activity_main); 
 mApiServer.register();
 }
3、以前是通过new ApiServer();获取这个实例的对象的吧。引入注解概念之后,不需要new对象了,直接通过如下的方式。
@Inject ApiServer mApiServer;
然后找到加注解的依赖类的构造方法:
public class ApiServer
 { 
 @Inject
 public ApiServer()

 Log.e("Howard","ApiServer--->start");
 } 
 /** * 往服务端保存用户信息 */
 public void register() 

 Log.e("Howard","ApiServer--->register");
 } 
这样我们就可以让目标类MainActivity中所依赖的其他类ApiServer,与其他类ApiServer的构造函数之间有了一种无形的映射联系。 这个时候Dagger2就会去找这个类的实例,文章开头也说了Components是一个桥梁,Dagger2会到中介Components中去找这个实例的(其实是借助Compoent找,他类似中介)。 所以要创建一个Component,概念也说了:我们必须用@Component注解一个接口然后列出所有的 ,他提供的是一系列的接口。例如这里通过如下方式:
4、创建Components对应上面的Component
@Component public interface UserCompoent { void inject(MainActivity mainActivity); }
注意Component是需要加@Component来注解的,这样系统才知道Component层Who && Where。void inject(MainActivity mainActivity);目的是让Component与Container(这里是MainActivity)发生关系的,因为Component需要引用到目标类(这里是MainActivity)的实例。 这样加入这个Component之后,大致流程如下: Component会查找目标类中用Inject注解标注的属性,查找到相应的属性后会接着查找该属性对应的用Inject标注的构造函数(这时候就发生联系了),剩下的工作就是初始化该属性的实例并把实例进行赋值。因此我们也可以给Component叫另外一个名字注入器(Injector) 这个时候,我们还没有把目标类(这里是MainActivity)给Component,还需要做一步工作: (需要Builder以下工程) 在MainActivity的onCreate()方法中:
DaggerUserComponet.create().inject(this);
5、创建Modules层对应上面的Module,创建Provides提供依赖对象
@Module public class UserModule { @Provides public ApiServer provideApiServer(){ Log.e("Howard","provideApiServer--->start"); return new ApiServer(); }
这里创建了UserModule 类,开始还说了在modules中,我们定义的方法是用@Provides这个注解,以此来告诉Dagger2我们想要构造对象并提供对应的依赖。这里创建provideApiServer()方法,通过@Provides注解,然后创建mApiServer依赖实例返回出去。 那么就这么创建了一个类有啥意义吗?没有意义,这个类显然是独立的,跟任何类没有半点关系。前面说到,Component是一个桥梁,而真正提供依赖的是Modules中,对应这个mApiServer实例应该由Modules那边给出。它应该与Component层产生点关系建立某种链接: 修改Component层的代码:
@Component(modules = UserModule.class) 
public interface UserCompoent 

 void inject(MainActivity mainActivity); 
}
@Component(modules = UserModule.class)一行代码就把Component与Modules建立了连接通道。添加log日志查看一下运行程序日志先后。

这样dagger简单实用基本完成。(注:jaywen工作室2018/9/12)

 

你可能感兴趣的:(Dagger2的基本使用)