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);
就能明白其原理