在Google Guice中如何将构造函数参数传入工厂?
如何在Dagger中通过辅助注入传递构造函数参数给嵌套工厂
看起来你正在用Dagger的辅助注入处理需要运行时参数的对象创建——要把BufferedImage同时传给PerPixelImageUpdater的构造函数,以及它依赖的PixelUpdaterFactory的create方法对吧?我来帮你梳理正确的实现步骤:
先整理下你给出的现有代码
PerPixelImageUpdater类
public class PerPixelImageUpdater implements ImageUpdater { private final PixelUpdater pixelUpdater; private final BufferedImage image; @Inject PerPixelImageUpdater(PixelUpdaterFactory pixelUpdaterFactory, @Assisted BufferedImage image){ this.image = image; this.pixelUpdater = pixelUpdaterFactory.create(image); } // 其他业务方法 }
未完成的ImageUpdaterFactory接口
public interface ImageUpdaterFactory { ImageUpdater create(BufferedImage image); }
完整实现步骤
配置辅助注入依赖(如果还没加)
首先确保项目里引入了Dagger辅助注入的相关依赖,以Gradle为例:implementation 'com.google.dagger:dagger:2.48' annotationProcessor 'com.google.dagger:dagger-compiler:2.48' // 安卓项目额外加下面两个 implementation 'com.google.dagger:dagger-android:2.48' annotationProcessor 'com.google.dagger:dagger-android-processor:2.48'给ImageUpdaterFactory添加@AssistedFactory注解
Dagger需要通过这个注解识别辅助注入工厂,自动生成实现类,修改后的工厂接口如下:import dagger.assisted.AssistedFactory; @AssistedFactory public interface ImageUpdaterFactory { ImageUpdater create(BufferedImage image); }确保PixelUpdaterFactory能被Dagger注入
PixelUpdaterFactory作为构造函数的依赖,必须是Dagger能提供的类型:- 如果它是接口,需要提供实现类并在Dagger模块中声明;
- 如果是类,需要有
@Inject标记的构造函数。
举个示例实现:
// PixelUpdaterFactory的实现类 public class PixelUpdaterFactoryImpl implements PixelUpdaterFactory { @Inject public PixelUpdaterFactoryImpl() {} // Dagger需要可注入的构造 @Override public PixelUpdater create(BufferedImage image) { return new ConcretePixelUpdater(image); // 替换成你的PixelUpdater实现 } } // 对应的Dagger模块 @Module public class ImageModule { @Provides PixelUpdaterFactory providePixelUpdaterFactory(PixelUpdaterFactoryImpl factory) { return factory; } }在Dagger组件中暴露工厂
让组件能提供ImageUpdaterFactory实例,方便外部调用:@Component(modules = {ImageModule.class}) public interface ImageComponent { ImageUpdaterFactory imageUpdaterFactory(); }使用工厂创建实例
现在就可以通过工厂便捷创建PerPixelImageUpdater,同时传入运行时的BufferedImage参数:// 初始化Dagger组件 ImageComponent component = DaggerImageComponent.create(); ImageUpdaterFactory updaterFactory = component.imageUpdaterFactory(); // 传入你的图片实例创建ImageUpdater BufferedImage targetImage = ...; // 你的BufferedImage对象 ImageUpdater updater = updaterFactory.create(targetImage);
关键注意点
@Assisted标记的是运行时动态参数,Dagger不会为这类参数提供依赖,完全通过工厂的create方法传入;@AssistedFactory是Dagger生成工厂实现类的标记,不用自己写工厂的具体逻辑;- 所有非辅助参数(比如
PixelUpdaterFactory)必须能被Dagger正确提供,否则会触发编译错误。
内容的提问来源于stack exchange,提问作者infojolt
相关产品推荐
相关产品推荐

