我对Dagger2的理解

原文来自:http://www.jianshu.com/p/39d1df6c877d

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);


        // 执行注入. 编译后, MainComponent 就会变成 DaggerMainComponent, 使用 Builder 模式实例化一个 Component, 然后执行了 inject.
        // 执行注入的是在这里, 所以 MainPresenter 实例化在这里, 如果没有执行这里就使用, 抛出 null 的.
         DaggerMainComponent.builder()
                // MainPresenter 中的 view 参数就是从这里来的. 这个 this 传过去的.
                // 在这里, MainComponent 中需要的 Module, 在这里生成实例化. 
                .mainModule(new MainModule(this))
                .build()
                // this 参数传递 MainActivity 给 inject 方法. 表明要注入到 MainActivity 中, 而不是 view 的实例.
                //MainPresenter 的构造方法是从 MainModule 中获取获取 view 参数的.
                .inject(this);
        //调用Presenter方法加载数据
         mainPresenter.loadData();

    }

}



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

    // 要注入到其他类中. 但是这个 view 参数怎么来的呢 ? 就会在 Module 里寻找, 
    @Inject
    MainPresenter(MainContract.View view) {
        mView = view;
    }    
    public void loadData() {
        //调用model层方法,加载数据
        ...
        //回调方法成功时
        mView.updateUI();
    }


// 提供实例. 即提供 presenter 所需要的 view.

// 构造方法需要的参数由这里提供.
@Module
public class MainModule {

    // 构造函数的
    private final MainContract.View mView;

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

    // 依赖靠这里提供. 当需要 MainView 的时候回自动调用的.
    @Provides
    MainView provideMainView() {
        return mView;
    }
}



// 这是桥梁. 本身不提供实例. 当注入的实例需要参数怎么办 ? 从 Module 里寻找. 或者从 标注有
// 注意了, component 只会实例化需要注入的类实例. 但是类实例需要参数, 怎么办 ? 那就从 Module 里寻找, 所以为什么需要 Module.
// 因为依赖到 MainModule, 所以要写 module. 但为什么 需要 module 呢, 因为 presenter 在实例化的时候需要一个参数. 即 View 参数.
// Module 提供 view 参数.
@Component(modules = MainModule.class)
public interface MainComponent {

    void inject(MainActivity activity);
}

另外还发现了经典的文章, 一个系列六篇, 看了会更明白 :
http://blog.csdn.net/u010961631/article/details/72625565

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值