首页
学习
活动
专区
工具
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实例可以不同线程获取不同线程属性threadLocalMapEntrykey为threadlocal变量。...总结 适用环境就是,每个线程都需要访问同一类型数据。而这个类型实例根据不同线程其具体内容有所不同,这样就需要这么一个ThreadLocal了。

3.1K20

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

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

2.1K60
  • 解决Kotlin 类实现多个接口,覆写多个接口中相同方法冲突问题

    / interface B{ fun x(): Int = 1 } interface C{ fun x(): Int = 0 } /**一个类实现了两个接口,两个接口中方法相同,这个类覆写时候就会出现冲突.../** * @author:wangdong * @description:类继承类,实现接口方法冲突问题 * 接口方法可以有默认实现 * 签名一致且返回值相同冲突 * 子类(实现类...,两个接口中方法相同,这个类覆写时候就会出现冲突*/ /**采用分支模式解决冲突问题*/ class D(var y: Int = 0):A() ,B,C{ //返回值一定要一样啊,例如:一定要是...,我们把 JVMRunnable 具体实现代理给了 jvmRunnable 这个实例,这个实例当然是可以保存状态,它一方面可以很好地解决我们前面提到接口默认实现问题,另一方面也能在提供能力同时不影响原有类...以上这篇解决Kotlin 类实现多个接口,覆写多个接口中相同方法冲突问题就是小编分享给大家全部内容了,希望能给大家一个参考。

    2.3K10

    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基本类型booleanjvm具体实现

    在前面javaboolean类型占多少字节?一文,对java基本数据类型,boolean进行过一些简单分析。...该文中得出,javaboolean类型,实际上存储时候是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

    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

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

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

    54171

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

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

    1.7K20

    上手指南 | 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.2K40

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

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

    2.6K30
    领券