android框架 - Degger2 - 降低耦合

Degger2

Github:https://github.com/google/dagger

使用:

场景:假设在MainActivity.java(目标类)中new创建XXX实例(实体类对象)
下面把这个过程比喻化为-在网上买商品
1、创建实体类(XXX.java)— 商品

//你的商品XXX
public class XXX {
	public XXX() {}
}

2、创建一个Module(MainModule.java) – 快递盒

//创建一个(Main)你专属的快递盒,需要写上地址和放入商品
@Module
public class MainModule {
    //需要在快递盒写上目标地址,即MainActivity,通过构造函数传进来
    private MainActivity mainActivity;
    public MainModule(MainActivity mainActivity){
        this.mainActivity = mainActivity;
    }

    //提供一个商品XXX,把商品装进快递盒里
    @Provides
    public XXX provideXXX(){
        return new XXX();
    }

}

3、创建一个Component(MainComponent.interface)-- 快递员

/**
 * 创建一个(Main)你专属的快递员,把快递送到你手中
 * 所以modules = MainModule.class声明要送的快递
**/
@Component(modules = MainModule.class)
public interface MainComponent {
    /**
     * 告诉快递员要将快递送往(inject)哪里
     * @param mainActivity
     */
    void inject(MainActivity mainActivity);
}

4、目标类(MainActivity.java)-- 我

public class MainActivity extends AppCompatActivity {

    /**
     * 声明我买的商品(需要的类实例)
     */
    @Inject
    XXX xxx;

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

        /**
         * DaggerMainComponent--当商品存在后自动生成这个商品的商家
         * DaggerMainComponent.builder()--商家新建订单(返回DaggerMainComponent.Builder)
         * mainModule(new MainModule(this))--在订单填写我的地址(MainActivity),地址也传到了快递盒上
         * build()--订单生成,分派给一个快递员(MainComponent)
         * inject(this)--告诉快递员送来(inject)我这里
         */
        DaggerMainComponent.builder()
                .mainModule(new MainModule(this))
                .build()
                .inject(this);

        Toast.makeText(this, xxx.toString(), Toast.LENGTH_SHORT)
                .show();
    }
}

--------------
附上两篇其他博主写得很好的教程

第一篇-使用:https://blog.csdn.net/mq2553299/article/details/73065745
第二篇-原理:https://blog.csdn.net/mq2553299/article/details/73136396

建议源码跟踪一遍
DaggerMainComponent.builder() .mainModule(new MainModule(this)) .build() .inject(this);就能明白其原理

猜你喜欢

转载自blog.csdn.net/weixin_44565784/article/details/100182930