Hilt依赖注入:如何为每个C类实例提供新的Dog实现类实例?
解决Hilt中每次注入都创建新实例的问题
你遇到的核心需求是让每个C类实例都能获得独立的Dog实例,其实只要调整Hilt绑定的作用域设置就能搞定,具体步骤和原理如下:
1. 确保绑定方法无作用域注解
你的ApplicationModule里的@Binds方法不要添加@Singleton或其他作用域注解,这样Hilt就不会缓存实例,每次注入都会创建新对象:
@Module @InstallIn(ApplicationComponent.class) public abstract class ApplicationModule { @Named("Dog") @Binds public abstract Animal provideDog(Dog dog); // 无作用域注解,每次注入生成新实例 @Named("Cat") @Binds public abstract Animal provideCat(Cat cat); }
2. 保持实现类构造器的无作用域状态
你已经给Dog和Cat的构造器添加了@Inject且没有作用域注解,这部分是正确的,继续保持:
public class Dog implements Animal { @Inject public Dog() { } // 无作用域限制,允许每次创建新实例 } public class Cat implements Animal { @Inject public Cat() { } }
原理说明
在Hilt的规则里:
- 带作用域的绑定(比如标注了
@Singleton)会在对应组件的生命周期内缓存实例,整个组件生命周期里只会生成一次。 - 未作用域的绑定不会缓存任何实例,每次有注入请求时都会创建一个全新的对象。
如果你之前发现Dog实例被共享,大概率是不小心给@Binds方法或Dog类加了@Singleton注解,去掉它就能解决问题。
另外补充:如果后续你希望某个类的实例和特定组件(比如Activity)绑定,但又想在该组件内每次注入都生成新实例,未作用域绑定依然是正确选择——只有当你需要在组件范围内共享同一个实例时,才需要添加对应作用域注解。
内容的提问来源于stack exchange,提问作者Raphael Mwasaru
相关产品推荐
相关产品推荐

