实体类的实例注入有两种注入的两种方式:
一种是从实体类构造函数注解的方式注入,如第二章所说,
另外一种就是通过模组管理器提供方注入,具体操作步骤如下:
application和activity的代码跟第一种同理不用更改,User实体类可以去掉@Inject注解符号,跟往常的实体类写法一样即可,不过需要新建一个模组管理器AppModule,具体代码如下:
@InstallIn(SingletonComponent::class)
@Module
class AppModule {
@Singleton
@Provides
fun provideUser(): User {
return User()
}
}
首先,@Module声明了模组管理器的类,然后@Provide声明了User实体的实例提供函数,然后重点来了,@InstallIn是指定要在其中安装入口点的组件的注解,其括号里面指定的是需要入口点组件的类,不同的组件类作用域不同,但是有一个必须遵照的规则,安装入口点的组件的作用域一定要与提供方(即User实体)的作用域一致。
这个规则该怎么理解,要从两方面,一个作用域的绑定关系,一个是如何通过组件绑定关系约束提供方的作用域,实际上就是对实体生命周期的控制。
下表列出了生成的每个组件的作用域注解:
而生成组件可以从android studio工程的External Libraries里面找到
可以看出来,AppModule绑定SingletonComponent组件的作用域是@Singleton,所以对应提供方的作用域也应该是@Singleton,这是规则限定的,除非提供方不指定作用域,如下图
<pre style="background:white">将提供方的@Singleton去注释掉,因为扩展包里SingletonComponent组件声明的作用域就是Singleton,那模组下的提供方只能是声明Singleton,除非提供方不指定作用域,使用默认的作用域,假如模组安装了ActivityComponent组件,那么User只能声明@ActivityScoped作用域了。
而作用域对应的生命周期,如下表:
从而这就通过组件在模组管理器上的安装不同组件,间接完成统一管理了各个实体的生命周期,即其活动范围,当然也还可以新建更多的模组区分管理多个实体,这样也更灵活了。