首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Hilt中具有相同实现的同一类型的多个实例

在Hilt中,如果你需要创建具有相同实现的同一类型的多个实例,你可以使用@Qualifier注解来区分它们。下面是一个简单的例子,展示了如何在Hilt中创建和使用具有相同实现的同一类型的多个实例。

首先,定义一个接口和两个实现类:

代码语言:javascript
复制
public interface MyInterface {
    void doSomething();
}

public class MyImplementation1 implements MyInterface {
    @Override
    public void doSomething() {
        System.out.println("Implementation 1");
    }
}

public class MyImplementation2 implements MyInterface {
    @Override
    public void doSomething() {
        System.out.println("Implementation 2");
    }
}

接下来,创建两个自定义的限定符注解:

代码语言:javascript
复制
import javax.inject.Qualifier;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface Implementation1 {}

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface Implementation2 {}

然后,在模块中使用@Binds和自定义限定符注解来提供依赖:

代码语言:javascript
复制
import dagger.Binds;
import dagger.Module;
import dagger.hilt.InstallIn;
import dagger.hilt.android.components.ApplicationComponent;

@Module
@InstallIn(ApplicationComponent.class)
public abstract class AppModule {

    @Binds
    @Implementation1
    abstract MyInterface provideMyImplementation1(MyImplementation1 myImplementation1);

    @Binds
    @Implementation2
    abstract MyInterface provideMyImplementation2(MyImplementation2 myImplementation2);
}

最后,在需要使用这些实例的地方,使用相应的限定符注解进行注入:

代码语言:javascript
复制
import javax.inject.Inject;

public class MainActivity extends AppCompatActivity {

    @Inject
    @Implementation1
    MyInterface myImplementation1;

    @Inject
    @Implementation2
    MyInterface myImplementation2;

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

        myImplementation1.doSomething();
        myImplementation2.doSomething();
    }
}
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

ThreadLocal原理——实现多个线程从同一个对象获取相同类型对象实例

ThreadLocal,网传可以实现多线程变量安全共享。其实它只是一个半成品,其本身并没有提供变量安全共享,它实现了一个多线程从同一个对象获取相同类型对象实例的工具。...变量中get出实例a,重点是这个threadLocal变量是可以跨线程的,在多个线程里做同样的事(set一个a1,a2...)否则跟在线程里直接new一个对象a就没有区别了。...如果你给多个线程中set了同样的实例小a,那么你应该在类型A方法中采用各种锁来保证实例小a是多线程安全的。...也验证了,其变量并不是同步共享的,只是通过同一个threadlocal实例可以在不同线程中获取不同线程的属性threadLocalMap中Entry的key为threadlocal的变量。...总结 适用的环境就是,每个线程都需要访问同一个类型的数据。而这个类型的实例根据不同线程其具体内容有所不同,这样就需要这么一个ThreadLocal了。

3.2K20

在ASP.NET MVC中如何应用多个相同类型的ValidationAttribute?

但是在默认情况下,对于同一个类型的ValidationAttribute特性只允许一个应用到目标元素上——即使我们将AllowMultiple属性设置为True。这篇文章的目的就是为了解决这个问题。...[源代码从这里下载] 一、一个自定义ValidationAttribute:RangeIfAttribute 为了演示在相同的目标元素(类、属性或者字段)应用多个同类的ValidationAttribute...具体的验证逻辑定义在重写的IsValid方法中。...在HttpPost的Index操作中,如果验证成功我们将“验证成功”字样作为ModelError添加到ModelState中。...在默认的情况下,Attribute的TypeId返回的是自身的类型,所以导致应用到相同目标元素的同类ValidationAttribute只能有一个。

2.1K60
  • NestJS中实现注入多个实现了同一个接口的Service

    在NestJS中有一种场景,在注入的时候需要将多个实现了同一个接口的service都注入到系统里,而NestJS中默认时没有这种注入,此时我们可以使用一个变通的provider来实现这一功能。...看下面例子,假定我们有一个OSService接口,其中定义了一个方法返回OSUser数组,假定我们有多个实现类,比如这里的LinuxOSService和WindowsOSService,我们希望将这两个实现类都注入到系统中...,然后在list方法中遍历这个数组,获取所有的OSUser对象,最后返回。...中定义了两个OSUserService的实现类,并且定义了一个新的provider,这个provider的名字是'OSUserServices',它的值是一个工厂函数,这个工厂函数接收两个参数,分别是LinuxOSUserService...NestJS中注入多个实现了同一个接口的service的功能,这种变通的方法可以解决一些特殊场景下的注入问题。

    7500

    Hilt 实战 | 创建应用级别 CoroutineScope

    这有助于关注点分离,因为容器类具有如下职责: 处理如何构造确切类型的逻辑; 持有容器级别作用域的类型实例; 返回限定作用域或未限定作用域的类型实例。...绑定 绑定 是 Hilt 中的一个常见术语,它表明了 Hilt 所知的如何提供类型的实例作为依赖项的信息。我们可以说,上文的代码片段就是使用 @Inject 在 Hilt 中添加了绑定。...提供 CoroutineDispatcher 的实现 我们需要提供相同类型 CoroutineDispatcher 的不同实现。换句话说就是,我们需要相同类型的不同绑定。...对 CoroutineDispatcher 类型具有多个绑定,因此当 CoroutineDispatcher 用作依赖项时,我们使用 @DefaultDispatcher 注解消除它的歧义。...因此,任何应该在后台执行的协程都可以在 AsyncTask 的线程池中执行。 在测试中可以使用 Hilt TestInstallIn API 让 Hilt 提供一个类型的不同实现。

    1K10

    在 Android 和 Hilt 中限定作用域

    当涉及到 DI (依赖项注入) 时,限定对象 A 的作用域为一个容器,则意味着该容器在销毁之前始终提供相同的 A 实例。 在 Hilt 中,您可以通过注解将类型的作用域限定在某些容器或组件内。...被限定作用域的类型在应用组件中沿 组件层次结构 向下传递: 在本案例中,相同的 UserManager 实例将被提供给层次结构内其余的 Hilt 组件。...应用中任何依赖于 UserManager 的类型都将获得相同的实例。 注意 : 默认情况下,Hilt 中的绑定都 未限定作用域 。这些绑定不属于任何组件,并且可以在整个项目中被访问。...每次被请求都会提供该类型的不同实例。当您将绑定的作用域限定为某个组件时,它会限制您使用该绑定的范围以及该类型可以具有的依赖项。...因为 Activity 具有 ViewModel 的访问权限,所以在该 Activity 中可以始终获得相同的 AnalyticsAdapter 实例。

    1.4K20

    java中基本类型boolean在jvm中的具体实现

    在前面在java中boolean类型占多少字节?一文中,对java的基本数据类型,boolean进行过一些简单的分析。...在该文中得出,java的boolean类型,实际上存储的时候是4Byte,boolean的操作与int无异。但是在boolean数组中,则每个boolean的长度为1Byte。...虚拟机中,boolean、byte、char、short 这四种类型,在栈上占用的空间和int是一样的,和引用类型也是一样的。...因此,在 32 位的HotSpot中,这些类型在栈上将占用 4 个字节;而在 64 位的 HotSpot中,他们将占8个字节。...对于 byte、char以及short这三种类型的字段或者数组单元,它们在堆上占用的空间分别为一字节、两字节,以及两字节,也就是说,跟这些类型的值域相吻合。(参考极客时间)

    1.2K20

    Hilt-依赖注入框架上手指南

    ; 但是,Dagger 允许绑定作用域到特定组件,如上表所示,在指定组件范围内,实例都只会创建一次,并且对该绑定的所有请求都将共享同一实例。...使用@Provides告诉Hilt如何获得具体实例 用来告诉Hilt 如何提供不能被构造函数注入的类型 每当 Hilt 需要提供该类型的实例时,将执行带注释的函数的函数主体。...由于我们具有AppDatabase传递依赖关系,因此我们还需要告诉Hilt如何提供该类型的实例。...Binds的作用就在于此。 需要注意以下使用条件: Binds 必须注释一个抽象函数,抽象函数的返回值是我们为其提供实现的接口。通过添加具有接口实现类型的唯一参数来指定实现。...只有一个具体实现类,但是往往实际开发,我们是存在多个具体实现。

    1.7K10

    SORT命令在Redis中的实现以及多个选项时的执行顺序

    图片SORT命令在Redis中实现了对存储在列表、集合、有序集合数据类型的元素进行排序的功能。SORT命令基本原理如下:首先,SORT命令需要指定一个key来表示待排序的数据。...SORT排序过程如下:首先从指定的key中获取到待排序的数据。根据指定的选项,将待排序的数据按照定义的规则进行排序。...Redis中的SORT命令可以使用多个选项,这些选项的执行顺序如下:ALPHA选项先于BY选项执行。...STORE选项在执行完以上选项之后执行。这个选项用于将排序结果保存到一个新的列表中。...下面是一个示例,说明了多个选项的执行顺序:假设有以下的待排序列表:"users",包含了三个用户信息:1. user:id:1 -> name:John Doe, age:30, salary:500002

    60371

    Jetpack Hilt 依赖注入框架上手指南

    ,并在运行时注入到对应的字段中,就是依赖注入,目的是为了类的解耦 例子:A 类 中用到了 B 类,一般情况下需要在 A 类中 new B() 的实例对象 采用依赖注入后,在 A 类中 定义一个私有的 B...并在运行的时候通过从相关的容器中获取出来 B 的对象并注入到 A 类中的 字段中。 这样做的好处是什么? 如果有很多个类需要使用 B 类。难道都要在各自的类中进行 new B() 吗。...Hilt 有关如何提供不同类型的实例信息也称之为绑定 @Module module 是用来提供一些无法用 构造@Inject 的依赖,如第三方库,接口,build 模式的构造等。...使用 @Module 在注解的普通类,在其中创建第三方依赖的对象即可。 @Module 模块用于向 Hilt 添加绑定,告诉 Hilt 如果提供不同类型的实例。...使用 @Binds 进行接口注入 Binds:必须注释一个抽象函数,抽象函数的返回值是实现的接口。通过添加具有接口实现类型的唯一参数来指定实现。

    1.5K20

    上手指南 | Jetpack Hilt 依赖注入框架

    @Inject 使用 @Inject 来告诉 Hilt 如何提供该类的实例,常用于构造方法,非私有字段,方法中。...Hilt 有关如何提供不同类型的实例信息也称之为绑定 @Module module 是用来提供一些无法用 构造@Inject 的依赖,如第三方库,接口,build 模式的构造等。...使用 @Module 在注解的普通类,在其中创建第三方依赖的对象即可。 @Module 模块用于向 Hilt 添加绑定,告诉 Hilt 如果提供不同类型的实例。...使用 @Binds 进行接口注入 Binds:必须注释一个抽象函数,抽象函数的返回值是实现的接口。通过添加具有接口实现类型的唯一参数来指定实现。...查找了一些资料: 主要问题之一是,通过在 Hilt 中发现模块的方式,无法区分哪些模块属于应用中的组件(如果他们确实使用过 Hilt) 已经库或其他库中的组件 另一个问题是,他将预先构建的组件层次结构变得复杂和混乱

    1.8K20

    上手指南 | Jetpack Hilt 依赖注入框架

    @Inject 使用 @Inject 来告诉 Hilt 如何提供该类的实例,常用于构造方法,非私有字段,方法中。...Hilt 有关如何提供不同类型的实例信息也称之为绑定 @Module module 是用来提供一些无法用 构造@Inject 的依赖,如第三方库,接口,build 模式的构造等。...使用 @Module 在注解的普通类,在其中创建第三方依赖的对象即可。 @Module 模块用于向 Hilt 添加绑定,告诉 Hilt 如果提供不同类型的实例。...---- 使用 @Binds 进行接口注入 Binds:必须注释一个抽象函数,抽象函数的返回值是实现的接口。通过添加具有接口实现类型的唯一参数来指定实现。...查找了一些资料: 主要问题之一是,通过在 Hilt 中发现模块的方式,无法区分哪些模块属于应用中的组件(如果他们确实使用过 Hilt) 已经库或其他库中的组件 另一个问题是,他将预先构建的组件层次结构变得复杂和混乱

    1.6K30

    Hilt 介绍 | MAD Skills

    在该类中,我们可以实现函数来告诉 Hilt 如何提供确切类型的实例。Hilt 已知的此类信息在行业内也被称为绑定。...函数体包含 Hilt 需要执行的代码块,这与我们手动实现完全一致。 返回类型 MusicDatabase 告知 Hilt 此函数提供什么类型。函数的参数告诉 Hilt 该类型所需的依赖项。...Hilt 组件 组件是 Hilt 生成的一个类,负责提供类型的实例,就像我们手动实现的容器一样。在编译期,Hilt 遍历依赖关系图,并生成代码,来提供所有类型并携带它们的传递依赖项。...因为我们可能希望在整个应用中重用相同的 MusicDatabase 实例。...在添加了 @Provides 注解的方法上,我们可以通过使用 @Singleton 注解来告诉 Hilt 组件总是共享该类型的相同实例。

    1K10

    Android--Hilt入门

    、构造函数注入 和Dagger相同,Hilt也分两种注入方式,以上篇Dagger中的代码为例子,来对比两个框架的使用区别 1.gradle中配置依赖 工程gradle中导入插件: dependencies...dataSource: DataSource ... 5.对Activity使用@AndroidEntryPoint注解 在Dagger中需要调用Component的注入方法,Hilt中直接使用注解就可以实现注入...的作用域就简单很多了,因为它预定义了组件和子组件 ,同时又定义了这些组件对应的作用域,上面的例子中,如何保证只实例化一份?...,对应的作用域为ViewModelScope,作用为:一个ViewModel中多个同类型注入对象,则使用同一份实例。...@Qualifier注解解决注入冲突 对于构造函数注入,只能有一个构造函数被@Inject注解,否则编译时报错 对于模块注入,如果多个@Provides注解的方法返回相同类型,使用@Qualifier注解可以解决冲突

    1.5K20

    Android注解三大框架Dagger、Hilt 和 Koin 有何不同?

    image.png Dagger 和 Koin 无疑是 Android 中最流行的两个依赖注入框架。这两个库具有相同的用途,而且看起来非常相似,但它们在底层的工作方式却非常不同。...相反,我想向您展示它们的本质区别以及这些差异对您的应用造成的影响。 Dagger 如果我们希望 Dagger 提供某个类的实例,我们要做的就是在构造函数中添加 @Inject 注解。...此类包含创建 CompositeAdapter 类的实例所需的所有信息。 image.png 如你所看到该工厂类实现了 get() 并返回了一个新的 CompositeAdapter 实例。...这实际上是此类实现的 Provider  接口中指定的方法。其他类可以使用 Provider 接口来获取一个类的实例。...测试数据的编写方式可以模拟多个级别的传递依赖关系,因此它不仅仅是具有 4 个类的虚拟应用程序。 image.png 如您所见,Dagger 对启动性能几乎没有影响。

    2.5K40

    Jetpack新成员,一篇文章带你玩转Hilt和依赖注入

    给相同类型注入不同的实例 友情提醒,别忘了刚才我们定义的ElectricEngine还没用上呢。 现在卡车配送公司通过送货赚到了很多钱,解决了温饱问题,就该考虑环保问题了。...Hilt也搞不清楚了。 因此这个问题需要借助额外的技术手段才能解决:Qualifier注解。 Qualifier注解的作用就是专门用于解决我们目前碰到的问题,给相同类型的类或接口注入不同的实例。...这样也就解决了给相同类型注入不同实例的问题。 第三方类的依赖注入 卡车这个例子暂时先告一段落,接下来我们看一些更加实际的例子。...为了方便开发者的使用,我们希望在NetworkModule中给Retrofit类型提供实例,而在创建Retrofit实例的时候,我们又可以选择让其依赖OkHttpClient,具体要怎么写呢?...Hilt一共内置了7种组件类型,分别用于注入到不同的场景,如下表所示。 ? 这张表中,每个组件的作用范围都不相同。其中,ApplicationComponent提供的依赖注入实例可以在全项目中使用。

    2.6K30
    领券