Andriod Dagger2依赖注入

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bobby_fu/article/details/84066556

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

    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/bobby_fu/article/details/84066556