Hilt

   依赖注入是一种广泛用于编程的技术。

1、依赖注入的优势

   1.1、重用代码
  能够复用一部分公共逻辑,比如如下的start()里面的一些操作,比如创建Engine、创建Car的操作。
   1.2、易于重构
   1.3、易于测试

class Car {
    private final Engine engine;
    public Car(Engine engine) {
        this.engine = engine;
    }

    public void start() {
        engine.start();
    }
}

  对于2和3的理解,Engine可能有子类,使用的时候才注入(传入)具体的对象,这样对于扩展是开放的,方便重构和测试。反观如果在这个类中直接创建Engine对象或者子类,非常不便于扩展和测试。
  上述代码是通过手动实现依赖注入。Hilt、Dagger2是一个在自动实现依赖注入的框架,本文主要介绍Hilt注入框架。

2、Hilt使用

2.1、对象注入,通过构造函数提供注入对象。

public class PersonBean {

    String name;
    int age;

    public PersonBean(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Inject
    public PersonBean() {
    }
}

2.2、对象注入,通过@Provides和@Moudle提供注入的对象。

@Module
@InstallIn(value = FragmentComponent.class)
public class PersonModule {

    @Provides
    public static PersonBean getPerson() {
        return new PersonBean("one_fragment", 1);
    }
}

2.3、接口对象(或者抽象类对象)的注入,通过@Binds和@Moudle获取具体的注入对象。

public interface AnalyticsService {
  void analyticsMethods();
}
public class AnalyticsServiceImpl implements AnalyticsService {
  ...
  @Inject
  AnalyticsServiceImpl(...) {
    ...
  }
}

@Module
@InstallIn(ActivityComponent.class)
public abstract class AnalyticsModule {

  @Binds
  public abstract AnalyticsService bindAnalyticsService(
    AnalyticsServiceImpl analyticsServiceImpl
  );
}

  @Binds函数返回类型会告知 Hilt 该函数提供哪个接口的实例。
  @Binds 函数参数会告知 Hilt 要提供哪种实现。

2.4、对象注入,通过@EntryPoint 注入。
  这种注入方式适合,某些类不支持hilt注入。例如ContentProvider,成员变量就不能通过hilt注入,因为整个hilt注入的起点是在Application的OnCreate,ContentProvider在此之前就初始化了。

@InstallIn(ActivityComponent.class)
@EntryPoint
public interface StudentPoint {

    public Student getStudent();
}

@AndroidEntryPoint()
class EnterPointActivity : AppCompatActivity() {

    private val TAG = "EnterPointActivity"

    @Inject
    lateinit var  student1 : Student

    @Inject
    lateinit var cpBean: CpBean

    @Inject
    lateinit var sound: Sound

    @SuppressLint("MissingInflatedId")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_enter_point)
        var point = EntryPointAccessors.fromActivity(this, StudentPoint::class.java)
        var student = point.student
    }
}

2.5、Component
  注入的对象的访问入口是Component,也就是所有注入对象的容器。
  Dagger框架中可以手动定义Component和SubComponent和子的SubComponent,导致Component较多,各个Component之间的Scope、moudle的关系,难以维护。
   Hilt将Component容器进行了分类。


组件的生命周期

组件作用域
@Module
@InstallIn(ActivityComponent.class)
public abstract class HiltStudentMoudle {

    @Provides
    public static CpBean getCpBean() {
        return new CpBean("张三", 34);
    }

    @Binds
    public abstract Sound bindSound(SoundImpl sound);

    @Provides
    @ActivityScoped
    public static Student getStudent() {
        return new Student("李四", 22);
    }
}

  上述加入@ActivityScoped注解,在同一个Activity(fragment,view)中,获取的Student对象,就是个单例。


组件的层次结构

  子组件可以使用父组件的绑定作为子组件的依赖项。ViewComponent 可以使用 ActivityComponent 中定义的绑定的依赖项。

3、HiltAndroidApp

  @HiltAndroidApp注解与@AndroidEntryPoint注解类似,只不过HiltAndroidApp会触发Dagger代码的生成。@AndroidEntryPoint主要将activity、fragment、view等注入到标准的android component中。

@HiltAndroidApp
public class ExampleApplication extends Application { ... }
4、总结

   Hilt与Dagger2对比,Hilt对Component、Scope进行了细分,防止创建过多的Component和SubComponent,注入的依赖对象生命周期由Component生命周期管理,各个Component、module依赖关系更加清晰。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,548评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,069评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,985评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,305评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,324评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,030评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,639评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,552评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,081评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,194评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,327评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,004评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,688评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,188评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,307评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,667评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,337评论 2 358

推荐阅读更多精彩内容