版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bobby_fu/article/details/84066556
Andriod Dagger2依赖注入
学习Dagger首先要了解什么是依赖注入(Dependency Injection),为什么需要依赖注入,了解这些以后就可以进入Dagger的学习,现在大部分的项目都在使用Dagger2,我们先就Dagger2进行学习,慢慢了解注入的机制。
what and why(Dependency Injection)
传统方法:
被依赖的对象(被调用者)
public class Book {
public Book(){
}
}
需要(依赖)这个对象,需要我们 new 一个对象(调用者)
public class MainActivity extends AppCompatActivity {
Book mBook;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBook=new Book();
}
}
why:
我们之所以需要依赖注入,最重要的就是为了解耦,达到高内聚低耦合的目的,保证代码的健壮性、灵活性和后期可维护性,根据业务需求也可以进行更好的变更。
how:
在Gradle中添加依赖
compile 'com.google.dagger:dagger:2.11'
annotationProcessor 'com.google.dagger:dagger-compiler:2.11'
在被依赖的类的构造函数上添加 @Inject 注解,表示我可以提供这个对象,你们可以用。
public class Xxx {
@Inject
public Xxx(){
}
}
或者
class AddressBookPresenter : BasePresenter<AddressBookView>() {
@Inject
lateinit var addressServiceImpl: AddressServiceImpl
}
class AddressServiceImpl @Inject constructor() : AddressService {
}
既然有了可以使用的对象,那么就需要有人去用他,这时XxxActivity出现了,表示我需要他,快给我,我是需求者,需要用@Module表示。
@Module
public class XxxActivity extends AppCompatActivity {
@Inject
Xxx mXxx;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
或者
/**
*Created by 付晓龙
*on 2018/10/9
*/
@Module
class AddressModule {
@Provides
fun addressService(service: AddressServiceImpl): AddressService {
return service
}
}
但是加进去了,需求者和提供者都有了,还没有用啊,该怎么用啊。这时就轮到@Component发挥作用了。然后,Dagger 预编译器会根据这个接口自动加上 Dagger- 前缀,生成一个实现类 DaggerXXXActivityComponent。
@Component
public interface XxxActivityComponent {
void inject(XxxActivity xxxActivity);
}
或者
/**
*Created by 付晓龙
*on 2018/10/9
*/
@PerComponentScope
@Component(dependencies = arrayOf(ActivityComponent::class), modules = arrayOf(AddressModule::class))
interface AddressComponent {
fun inject(activity: AddressBookActivity)
...
}
DaggerAddressComponent.builder().activityComponent(activityCoponent).addressModule(AddressModule()).build().inject(this)
这时提供者、需求者以及传递者都有,最后进行需要手动输入,决定注入的时机。这里就在 onCreate 注入 Xxx 对象,再次修改 XxxActivity,添加DaggerMainActivityComponent.create().inject(this):
@Module
public class XxxActivity extends AppCompatActivity {
@Inject
Xxx mXxx;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerXxxActivityComponent.create().inject(this);
}
}