You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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);
}

完整实现步骤

  1. 配置辅助注入依赖(如果还没加)
    首先确保项目里引入了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'
    
  2. 给ImageUpdaterFactory添加@AssistedFactory注解
    Dagger需要通过这个注解识别辅助注入工厂,自动生成实现类,修改后的工厂接口如下:

    import dagger.assisted.AssistedFactory;
    
    @AssistedFactory
    public interface ImageUpdaterFactory {
        ImageUpdater create(BufferedImage image);
    }
    
  3. 确保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;
        }
    }
    
  4. 在Dagger组件中暴露工厂
    让组件能提供ImageUpdaterFactory实例,方便外部调用:

    @Component(modules = {ImageModule.class})
    public interface ImageComponent {
        ImageUpdaterFactory imageUpdaterFactory();
    }
    
  5. 使用工厂创建实例
    现在就可以通过工厂便捷创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:03:23