Dagger2使用方法及源码解析(二)

接上篇文章
4.Dagger2使用方法拓展:

_4.1Dagger2实现单例模式:
在java中,实现单例模式的方法有很多,如:

利用  synchronized锁实现橘子类的单例
public class Orange{

    private static Orange instance;

    private Orange() {
    }

    public static Orange getInstance() {
        if ( instance == null ) {
            synchronized ( Orange.class ) {
                if ( instance == null ) {
                    instance = new Orange();
                }
            }
        }

        return instance;
    }
}

而在Dagger2中,我们可以这样实现:

(1).首先我们用 @Sington注解标记要获取单例的类

@Singleton
public class Orange
{
    @Inject
    public Orange() {
        Log.d("111", "Orange: 我是橘子");
    }
}

然后用 @Sington注解标记我们的需要用到单例依赖的Component类。

@Singleton
@Component(modules = {DaggerModule.class})
public interface MainActivityComponent
{
    //为传入的MainActivity对象注入所需的依赖knife,并且为knife注入所需要的的依赖
    void inject(MainActivity mainActivity);
}

然后我们在MainActivity中

@Inject
Apple apple1;

@Inject
Apple apple2;

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            log.d("lll",apple1.toString());
            log.d("lll",apple2.toString());
            }
  }

然后我们就会发现输出的对象编号都是一样的。我们顺利地用Dagger2实现了单例模式。
如果你使用的是provider的方式注入的对象,在 @Provider注解上方添加 @Sington注解即可。

_4.2Dagger2实现延迟加载:
有时候我们为了提升软件的加载速度,会让一些非必须的类进行延迟加载,即当用到它的时候再去加载。
在Dagger2中,我们这样实现:

@Inject
Lzay<T> t;

//Lzay是泛型类,只要传入我们需要的类即可

_4.3Dagger2实现强制重新加载:
有时候我们想要每次都获取一个全新的对象的时候,在Dagger2中,我们这样实现:

    @Inject
    Provider<T> t;

    //Provider是泛型类,只要传入我们需要的类即可

_4.4Component:之间的依赖

我们在一个Compontent1中可以提供一个依赖A,在另外一个Compontent2中可以提供依赖B,C。而我们有一个需求就是需要用到ABC三个依赖,我们就可以让Compontent2依赖Compontent1.这样我们的就可以直接使用Compontent2来获取Compontent1中的依赖。
比如我们现在有一个专门提供水果这个依赖

@Component(modules = {DaggerModule.class} ,dependencies = MainActivityComponent.class)
public interface FruitComponent
{
   Orange getOrange();
}

光是这样还是不够的,我们需要在用到这个FruitComponent时传入一个MainActivityComponent。

       MainActivityComponent mainActivityComponent  = MainActivityComponent.builder()
                .build()
                .inject(this);
                
		DaggerFruitComponent
		.builder()
		.mainActivityComponent (mainActivityComponent )
        .build();

_4.5Provider方法返回相同类型的依赖时的区分方式

在同一个module中,Dagger是靠依赖的类型来选择Provider的。但有时候同一个Module中会有返回两个相同的依赖的两个方法,这时候我们就要用到 @Named注解。@Named使用非常简单,我们在@Inject注解下方加上**@Named注解,然后在Modul中 @Provider注解下方也加入@Named**注解即可,如下:

@Inject
@Named("bnana1")
Bnana bnana1;

@Inject
@Named("bnana2")
Bnana bnana2;


@Module
public class DaggerModule {

    @Provides
    @Named("bnana1")
    public Bnana getBnana()
    {
        log.d("111,"我是bnana1")
        return new Bnana();
    }
    
    @Provides
    @Named("bnana2")
    public Bnana getBnana()
    {
        log.d("111,"我是bnana2")
        return new Bnana();
    }
}

到这里,Dagger2的使用方法介绍就结束了,下篇文章我们一起学习一下Dagger2源码。

发布了47 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41525021/article/details/103591861
今日推荐