Dagger2之Singleton单利--第五章

单利

一个对象在整个程序生命周期只存在1个,我们把它称为单利,什么懒汉,饿汗,静态内部类单利(推荐)都是实现的方式。

在Dagger只需要一个注解就OK了@Singleton

简单运用

@Module
public class TestModule {
    @Provides
    @Singleton//主要是这样
    public OkHttp providesOkHttp(){
        return new OkHttp();
    }
}
@Singleton  //注意这里Moudle中有singleton的,component也必须写
@Component(modules = {TestModule.class})
public interface TestCompent {
    void inject(Main2Activity main2Activity);
}

okhttp是我随便创建了一个对象

public class Main2Activity extends AppCompatActivity {

    @Inject
    public OkHttp okHttp;

    @Inject
    public OkHttp okHttp2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        DaggerTestCompent.create().inject(this);
        log(okHttp+"");
        log(okHttp2+"");
    }

    public void log(String value){
        Log.d("wyz", value);
    }
}

这样你就算写了2个,发现2个都是一个对象,这就是简单的使用。

接下来考虑一个业务情景,顺便说下Component的dependencies依赖

例如,app有很多请求,我们只需要一个OkHttp对象,我们创建了很多Component,我们只需要让创建的依赖我们一开始创建的1个单利的Component,以后所有的都依赖这个

比如我们有一个登录业务的功能

我们先创建所有的单利

@Module
public class AppModule {

    @Singleton
    @Provides
    public OkHttp providesOkHttp(){
        return new OkHttp();
    }

}

@Singleton
@Component(modules = {AppModule.class})
public interface AppCompent {
    OkHttp okhttp();//注意这里,没有注入方法,只有一个桥接方法,告诉我提供哪些对象
}

接下来就是去依赖

@UserSingleton
@Component(dependencies = {AppCompent.class})
public interface UserCompent {
    void inject(MainActivity mainActivity);
}

使用规则记录下:

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

猜你喜欢

转载自blog.csdn.net/wenyingzhi/article/details/80031834