Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用带弹簧注入的生成器模式?_Java_Spring_Builder_Composition_Spring Ioc - Fatal编程技术网

Java 如何使用带弹簧注入的生成器模式?

Java 如何使用带弹簧注入的生成器模式?,java,spring,builder,composition,spring-ioc,Java,Spring,Builder,Composition,Spring Ioc,TL;DR:我如何在SpringIOC中使用构图生成器模式 我正在创建一个Spring项目,该项目根据某些字段的分布参数填充一个表(即50%的记录必须为a类型、40%的B类型、10%的C类型;对于每种类型,50%的记录必须为子类型1、20%的子类型2、10%的子类型3等) 为了加快记录创建速度,我有一个RecordFactory,它计算这些参数的分布并返回RecordBuilder列表。每个RecordBuilder都扩展了可调用接口以同时处理和返回记录: 到目前为止,考虑到类型A、B和C,我

TL;DR:我如何在SpringIOC中使用构图生成器模式

我正在创建一个Spring项目,该项目根据某些字段的分布参数填充一个表(即50%的记录必须为a类型、40%的B类型、10%的C类型;对于每种类型,50%的记录必须为子类型1、20%的子类型2、10%的子类型3等)

为了加快记录创建速度,我有一个RecordFactory,它计算这些参数的分布并返回RecordBuilder列表。每个RecordBuilder都扩展了可调用接口以同时处理和返回记录:

到目前为止,考虑到类型A、B和C,我所做的是创建一个TypeABuilder、TypeBBuilder和TypeCBuilder,它为每种类型返回不同的ProcessorFactory实现:

public class RecordFactory {
    @Inject
    private transient TypeABuilder aBuilder;
    @Inject
    private transient TypeBBuilder bBuilder;
    @Inject
    private transient TypeCBuilder cBuilder;

    public List<DataBuilder> getBuilders() {
        // calculates distribution for each type and add the builders accordingly
    }
}

现在我的问题是:当我在构建器中创建一个新的ProcessorFactoryImpl时,我无法注入处理器。如何在Spring中使用builder模式,保持这种灵活性?

您是否考虑过Spring的AbstractFactory?我不太了解您的场景,但更好的方法是使用AbstractFactory。@Xstian是的,但我是否仍然需要m x n工厂实现来创建数据生成器?您必须拥有所有实现,但您可以通过
查找方法
和AbstractFactory来使用它,以避免失去spring的好处。
@Component
@Scope("prototype")
public class Builder {
    private Type type;
    private Subtype subtype;

    public Builder setType(Type type) {`
        this.type = type;
        return this;
    }

    public setSubtype(Subtype subtype) {
        this.subtype = subtype;
        return this;
    }

    public ProcessorFactory createFactory() {
        return new ProcessorFactoryImpl(this);
    }
}

public class ProcessorFactoryImpl {
    @Inject
    private transient TypeProcessor typeProcessor;

    @Inject
    private transient SubtypeProcessor subtypeProcessor;

    public ProcessorFactoryImpl(Builder builder) {
        typeProcessor.setType(builder.getType());
        processors.add(typeProcessor);
        subtypeProcessor.setSubtype(builder.getSubtype());
        processors.add(subTypeProcessor);
    }
}