Android中的依赖项注入学习笔记

2020-11-20  本文已影响0人  132xin

什么是依赖项注入

依赖项注入(DI)是一种广泛用于编程的技术,是一种对象接收其依赖的其他对象的技术,这些其他对象称为依赖项。类通常需要引用其他类,类可以通过以下三种方式获取所需的对象:
  1.直接在类构成其所需的依赖项。
  2.从其他地方抽取。
  3.以参数形式提供。应用可以在构造类时提供这些依赖项,或者将这些依赖传入需要各个依赖项的函数。
上面的三种方式中,第三种方式就是依赖项注入!使用这种方法,可以获取并提供类的依赖项,而不必让类实例自行获取。

在Android中有两种依赖项注入方法:

示例

以汽车和引擎为例,汽车需要依赖引擎才能发动,以下分别通过两种方式实现:非依赖注入和依赖注入。

非依赖注入的方式:
fun main(){
    val car = Car()
    car.start()

}
class Car(){
    private val mEgine=Engine()
    fun start(){
        mEgine.start()
    }
}
class Engine{
    fun start(){

    }
}
依赖注入的方式:

 构造函数注入


fun main(){
    val engine = Engine()
    val car = Car(engine)
    car.start()

}
class Car(val engine:Engine){
    fun start(){
        engine.start()
    }
}
class Engine{
    fun start(){

    }
}

 字段注入

fun main(){
    
    val car = Car()
    car.mEgine=Engine()
    car.start()

}
class Car(){
    lateinit var mEgine: Engine
    fun start(){
        mEgine.start()
    }
}
class Engine{
    fun start(){

    }
}

自动依赖项注入

程序员自行创建,提供并管理不同类的依赖项,而不依赖于库的依赖注入方式,称为手动依赖项注入或人工依赖项注入。随着依赖项和类增多,手动依赖项注入就越繁琐。手动依赖项注入还会带来多个问题:

解决这类问题得方法可以归为两类:

Dagger是适用于Android的热门依赖库注入库,它提供了完全静态和编译时依赖项,解决了基于反射方案的开发和性能问题。

依赖项注入的优势

Dagger在Android上的简单使用

添加依赖
    implementation 'com.google.dagger:dagger:2.4'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.4'
Dagger的注解解析
基本的使用

1.通过@Inject、@Component实现依赖注入。


public class User {
    private  String name;


    @Inject
    public User(){
        this.name="Dagger";
    }

    public String getName() {
        return name;
    }
}



/**
 * 定义一个桥梁Component
 */
@Component
public interface MainComponent {
    /**
     *
     * 方法的参数传入需要注入的类名,不能是其父类。方法名可以自定义。
     * @param mainActivity
     */
    void inject(MainActivity mainActivity);
}

public class MainActivity extends AppCompatActivity {

    //不能修饰private的变量
    @Inject
     public User user;

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

点击Make Project就会自动生成相应的代码。然后就可以通过生成的以Dagger为前缀的类,完成依赖对象的注入。

  DaggerMainComponent.builder().build().inject(this);

用@Inject存在些个缺点

2.通过@Provides,@Module配合提供实例


public class User {
    private  String name;

    //这里不再需要Inject
    public User(
            String name
    ){
        this.name=name;
    }

    public String getName() {
        return name;
    }
}

@Module
public class MainModule {

    @Provides
    public User provideUsr(){
        return new User("Dagger");
    }
}


/**
 * 定义一个桥梁Component
 */
@Component(modules = {MainModule.class})
public interface MainComponent {
    /**
     *
     * 方法的参数传入需要注入的类名,不能是其父类。方法名可以自定义。
     * @param mainActivity
     */
    void inject(MainActivity mainActivity);
}

Make Project的之后,就可以在目标类中初始化注入

public class MainActivity extends AppCompatActivity {
    @Inject
     public User user;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        DaggerMainComponent.create().inject(this);
    }
}

以上是Dagger的简单使用,Dagger还有很多功能,需要后续去学习和完善。

参考链接:
https://blog.csdn.net/qq_24442769/article/details/79363231?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control

上一篇 下一篇

猜你喜欢

热点阅读