Dagger2初步使用心得

最近闲来没事,看见依赖注入(Dependency Injection简称DI)就想想看看,学习一下,先说Dagger2使用优点:可以方便的修改,构建对象,可以非常方便的进行单元测试.关键就在于解除了数据和业务逻辑代码的耦合(dagger2 是用来方便的解除耦合,并不是只有使用了dagger2 就可以,还需要良好的设计和架构);缺点也很明显,学习成本较高,比较难入手,稍有不甚,就会导致编译出错.当然我也是刚使用,方便初学的时候看一看,深入的话,后期有机会还会更新自己的心得.

首先使用前需要Studio配置以下:

在project的build.gradle中dependencies中添加:

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

在module的build.gradle中的

	apply plugin: 'com.android.application'
	下面添加这么一行:
	apply plugin: 'com.neenbedankt.android-apt'//目的是添加apt命令
	在dependencies中添加
	apt 'com.google.dagger:dagger-compiler:2.0.2' //指定注解处理器
   	 compile 'com.google.dagger:dagger:2.0.2'  //dagger公用api
    	provided 'org.glassfish:javax.annotation:10.0-b28'  //添加android缺失的部分javax注解

使用前先介绍以下Dagger2的几个主要元素

1:inject 主要是用来标注目标类的依赖和依赖的构造函数
2: module 就是用来提供对象的
3: provides 在module中提供对象的方法
	4:component 是作为inject和module的中间桥梁,inject哪个对象,就会去对应的component中找,然后component会在module中去拿
当然Dagger2还有其他的几个元素:scope,qualifier...这些以后在总结,现在举个栗子,上代码,写个很简单的demo:
	首先,我们写一个很简单的Use类,就是提供Use对象的,先给他上面加一个@module,为了便于后面测试,我们给这个类加一个很简单的方法:

@Module
public class Use {



    public void hit(){
        Log.d("Dagger2","打人");
    }
}

	然后假如我们需要在MainActivity中,需要用到这个use的一个对象,并且要调用打人的方法:
		首先在MainActivity中inject一个对象,这样:
@Inject
Use use;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    use.hit();
}
这样就可以了么?Nonono..这时候我们已经建好了module,并且已经在MainActivity中inject了use对象,这时候我们需要创建一个UseComponent,来作为这两个的桥梁,而且
component必须是interface:
	
@Component(modules = Use.class)
public interface UseComponent {
}
	上面这一步是将component和module关联起来,接下来:
@Component(modules = Use.class)
public interface UseComponent {
    void inject(MainActivity mainActivity);
}
在component中加一个方法,这个是为了讲component和MainActivity关联起来
当然这样还是没有结束,因为我们没有提供use的方法,如果直接rebuild,会报:
Error:(11, 10) 错误: com.example.dagger.Use cannot be provided without an @Inject constructor or from an @Provides- or @Produces-annotated method.
com.example.wanghaiwei.dagger.MainActivity.use
[injected field of type: com.example.dagger.Use use]
	怎么办呢,当然是需要在module中写一个提供use对象的方法,就是我们的provides了:
@Module
public class Use {

    @Provides
    Use provideUse(){
        return new Use();
    }
    
    public void hit(){
        Log.d("Dagger2","打人");
    }
   
}
这样在rebuild一下,就能通过了,这个时候Dagger2会给我们生成一个DaggerUseComponent的类,然后我们在MainActivity中这样使用:
public class MainActivity extends AppCompatActivity {

    @Inject
    Use use;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        DaggerUseComponent.create().inject(this);
        use.hit();
    }
}
然后我们试一试,看看打人方法有没有走哈:
08-22 17:21:53.280 30358-30358/com.example.dagger D/Dagger2: 打人
还有一点就是在module中还有一种提供对象的写法是这样的:
@Module
public class Use {

    /*@Provides
    Use provideUse(){
        return new Use();
    }*/
    @Inject
    public Use(){

    }
    public void hit(){
        Log.d("Dagger2","打人");
    }
   
}
这样也可以,其实使用inject注入,这两种都可以,不过就是provide的优先级比inject高,dagger2会先在provide中找,没有找到就会去inject找,如果都没有,就会报错....当然,你会
说这样好麻烦啊,为啥不直接new Use();这个只是一个简单例子哈,突出不了Dagger2的有点,这个只是为了给刚使用Dagger2的看看哈,这篇只是当做使用心得,看看就好哈....
 
 
 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值