Dagger2学习

  • 一 最简单实现方式

1,需要一个model ,用来提供对象 使用@model来进行注解,提供对象的方法使用@Provides来进行注解

@Module
public class DataBaseModel {
    @Provides
    public DataBaseBean getDataBaseBean(){
        return new DataBaseBean();
    }
}

2,需要一个compoent组件来将对象注入到其它类中,这是一个接口,实现类会有系统帮我们生成;用标识符@Compoent来注解,通过modules来与需要的Model类链接,可以存放多个model类

通过自定义方法来进行注入


@Component(modules = { DataBaseModel.class})
public interface MyCompoent {
    
//注入到mainActivity中
    void injectMain(MainActivity mainActivity);

}

3,使用

在Activity通过@Inject来对对象引用进行注解,通过creat或者build的方式进行创建,最简单方式完成

package com.example.dagger2demo;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

import com.example.dagger2demo.bean.DataBaseBean;
import com.example.dagger2demo.bean.HttpObject;
import com.example.dagger2demo.compoent.DaggerMyCompoent;
import com.example.dagger2demo.model.DataBaseModel;
import com.example.dagger2demo.model.LoginModel;

import javax.inject.Inject;

public class MainActivity extends AppCompatActivity {

    @Inject
    HttpObject httpObject;
    @Inject
    DataBaseBean dataBaseBean;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //简单直接创建方式
//        DaggerMyCompoent.create().injectMain(this);
        //另一种方式使用,可以对model进行传参
        DaggerMyCompoent.builder()
                .loginModel(new LoginModel())
                .dataBaseModel(new DataBaseModel())
                .build()
                .injectMain(this);
        Log.i("jett",httpObject.hashCode()+"");
        Log.i("jett",dataBaseBean.hashCode()+"");
    }
}

二,局部单例模式

1.需要在model 与compoent 加上关键字@Singleton


@Singleton
@Module
public class LoginModel {
    //注解成单例模式
    @Singleton
    //注解方法对象
    @Provides
    public HttpObject getHttpObject(){
        return new HttpObject();
    }
}



 

@Singleton
@Component(modules = {LoginModel.class, DataBaseModel.class})
public interface MyCompoent {

    void injectMain(MainActivity mainActivity);

}

如此,同一个activity中两个对象就是同一个hashCode


    @Inject
    HttpObject httpObject;
    @Inject
    HttpObject httpObject2;

局部单例只适用于同一个activity,因为注入的不同的activity会生成不同的compoent对象,

三 全局单例

1,将获取MyCompoent的方法放进Application中进行初始化,在Activity中直接获取该Conpoent,即可获取全局的单例对象

public class MyApplication extends Application {

    private MyCompoent myCompoent;

    @Override
    public void onCreate() {
        super.onCreate();
        myCompoent = DaggerMyCompoent.builder()
                .dataBaseModel(new DataBaseModel())
                .loginModel(new LoginModel())
                .build();
    }

    public MyCompoent getMyCompoent(){
        return myCompoent;
    }

}

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ((MyApplication)getApplication()).getMyCompoent().injectMain(this);
    }

四,多个Compoent同时使用

1,多个Compoent是不能同时注入到一个类中的,可以使用dependenices方式实现该功能,

@Singleton
@Component(modules = {LoginModel.class, DataBaseModel.class},
            dependencies = {TestCompoent.class}
)
public interface MyCompoent {

    void injectMain(MainActivity mainActivity);
    void injectTest2(Test2Activity test2Activity);

}


@Component(modules = {TestModel.class})
public interface TestCompoent {

    //不能使用这种依赖方式,会报错
//    void injectMain(MainActivity mainActivity);
//    void injectTest2(Test2Activity test2Activity);
    
    public Test getTest();
}

//Application加入该Compoent
  @Override
    public void onCreate() {
        super.onCreate();
        myCompoent = DaggerMyCompoent.builder()
                .dataBaseModel(new DataBaseModel())
                .loginModel(new LoginModel())
                .testCompoent(DaggerTestCompoent.create())
                .build();
    }

这种方式适用于test不是Singleton,如果都想时单例模式,这种方式会报错可以使用dependencies与scope结合使用的方式

/**
 * 可以点击singleton 拷贝源码的方式书写这个类
 */
@Scope
@Documented
@Retention(RUNTIME)
public @interface AppScope {}

@Scope
@Documented
@Retention(RUNTIME)
public @interface UserScope {}

不同的compoent与对应的model 使用不同的scope


@UserScope
@Module
public class TestModel {

    @UserScope
    @Provides
  public   Test getTest(){
        return new Test();
    }
}

@UserScope
@Component(modules = {TestModel.class})
public interface TestCompoent {

    //不能使用这种依赖方式,会报错
//    void injectMain(MainActivity mainActivity);
//    void injectTest2(Test2Activity test2Activity);

    public Test getTest();
}
@AppScope
@Module
public class LoginModel {
    //注解成单例模式
    @AppScope
    //注解方法对象
    @Provides
    public HttpObject getHttpObject(){
        return new HttpObject();
    }
}


/***
 * 使用dependencies与scope 结合需注意
 * 不同的Compoent上,Scope不能相同
 * 没有scope的不能去依赖有scope的Compoent
 */

@AppScope
@Component(modules = {LoginModel.class, DataBaseModel.class},
            dependencies = {TestCompoent.class}
)
public interface MyCompoent {

    void injectMain(MainActivity mainActivity);
    void injectTest2(Test2Activity test2Activity);

}

这样就可以实现了

源码下载地址:https://download.csdn.net/download/feng_zhongsha/16636455

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值