Dagger2学习

官方GitHub:https://github.com/google/dagger
示例代码(参考:https://blog.csdn.net/wusejiege6/article/details/102644782)

public class MainActivity extends AppCompatActivity implements MainContract.View {
    private MainPresenter mainPresenter;
    ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //实例化presenter 将view传递给presenter
        mainPresenter = new MainPresenter(this);
        //调用Presenter方法加载数据
         mainPresenter.loadData();

         ...
    }

}

public class MainPresenter {
    //MainContract是个接口,View是他的内部接口,这里看做View接口即可
    private MainContract.View mView;

    MainPresenter(MainContract.View view) {
        mView = view;
    }

    public void loadData() {
        //调用model层方法,加载数据
        ...
        //回调方法成功时
        mView.updateUI();
    }

public class MainActivity extends AppCompatActivity implements MainContract.View {
    @Inject
    MainPresenter mainPresenter;
    ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

         DaggerMainComponent.builder()
                .mainModule(new MainModule(this))
                .build()
                .inject(this);
        //调用Presenter方法加载数据
         mainPresenter.loadData();

         ...
    }

}

public class MainPresenter {
    //MainContract是个接口,View是他的内部接口,这里看做View接口即可
    private MainContract.View mView;

    @Inject
    MainPresenter(MainContract.View view) {
        mView = view;
    }    
    public void loadData() {
        //调用model层方法,加载数据
        ...
        //回调方法成功时
        mView.updateUI();
    }

@Module
public class MainModule {
    private final MainContract.View mView;

    public MainModule(MainContract.View view) {
        mView = view;
    }

    @Provides
    MainView provideMainView() {
        return mView;
    }
}

@Component(modules = MainModule.class)
public interface MainComponent {
    void inject(MainActivity activity);
}

总结:
1、作用分析
将依据代码:

mainPresenter = new MainPresenter(this);

变成:

DaggerMainComponent.builder()
       .mainModule(new MainModule(this))
       .build()
       .inject(this);

@Module
public class MainModule {
    private final MainContract.View mView;

    public MainModule(MainContract.View view) {
        mView = view;
    }

    @Provides
    MainView provideMainView() {
        return mView;
    }
}

@Component(modules = MainModule.class)
public interface MainComponent {
    void inject(MainActivity activity);
}

看起来代码量增加不少,由一行new代码变成几行代码+两个额外的绑定类,值得吗?
唯一的作用就是初始化的硬耦合,变成类似build模式的软耦合。
2、原理
它是通过apt插件在编译阶段生成相应的注入代码。
Dagger2学习_第1张图片
生成被依赖注入和module的工厂类,在Component类中实例化,最后调用inject方法注入到被依赖类中。懂得了原理,就知道为什么要那么复杂的解耦了。

疑问:
1、在Component类中要声明使用者的类,谈何解耦?
Component类的作用有两个:

  • 把依赖与被依赖类绑定到一起
  • 提供参数module

如果不需要参数,按理说,也可以不需要Component类,通过注解可以关联依赖与被依赖类,但是带参数就需要Component类来关联依赖、被依赖类和参数类三者之间的关系。

2、MainPresenter作为被依赖注入的类,也需要用@Inject修饰,那么对于第三方引入的类,可能并不适用,谈何解耦?
第三方如果不支持Dagger肯定就不能用了,因为不能正常的实例化。

3、只适用于MVP?
应该说是MVP急切需要Dagger进行解耦,所以Dagger与MVP可以说是天作之合。MVVM从架构上来说,可能并不那么急切需要Dagger,但是在局部地区,也可以说Dagger来解耦。

你可能感兴趣的:(android学习)