Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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 Spring与FactoryModuleBuilder、@AssistedInject和@Assisted in Guice的等价物是什么?_Java_Spring_Guice - Fatal编程技术网

Java Spring与FactoryModuleBuilder、@AssistedInject和@Assisted in Guice的等价物是什么?

Java Spring与FactoryModuleBuilder、@AssistedInject和@Assisted in Guice的等价物是什么?,java,spring,guice,Java,Spring,Guice,中的、、和的等价物是什么?换句话说,推荐使用Spring创建工厂对象的方法是什么,这些工厂对象的方法接受应用程序(而不是容器)必须提供的参数 Spring静态工厂方法与FactoryModuleBuilder不同FactoryModuleBuilder构建一个Guice模块,该模块生成实现的“工厂”。与Spring静态工厂方法不同,这些工厂对象的方法是实例方法,而不是静态方法。静态工厂方法的问题是,它是静态的,并且没有实现接口,因此不能用替代工厂实现替换它。但是,不同的FactoryModule

中的、、和的等价物是什么?换句话说,推荐使用Spring创建工厂对象的方法是什么,这些工厂对象的方法接受应用程序(而不是容器)必须提供的参数


Spring静态工厂方法与FactoryModuleBuilder不同
FactoryModuleBuilder
构建一个Guice模块,该模块生成实现的“工厂”。与Spring静态工厂方法不同,这些工厂对象的方法是实例方法,而不是静态方法。静态工厂方法的问题是,它是静态的,并且没有实现接口,因此不能用替代工厂实现替换它。但是,不同的
FactoryModuleBuilder
实例可以构建实现相同接口的不同工厂。

我不完全确定这个问题是否重复(只有90%确定),但这个答案是:

似乎有你需要的信息。具体来说,您应该这样做:

我通过从上下文中提取构造函数arg中使用的bean实例,然后用运行时使用的值填充它,从而使它工作起来。当您获得工厂生成的bean时,这个bean将被用作参数


我建议阅读完整的答案。

Spring没有与Guice
FactoryModuleBuilder相当的版本。最接近的等价物是一个Spring
@Configuration
类,它提供了一个工厂bean,实现了一个工厂接口,该工厂接口的方法接受来自应用程序的任意参数。Spring容器可以将依赖项注入到
@Configuration
对象中,然后再提供给工厂构造函数。与
FactoryModuleBuilder
不同,Spring方法生成了许多典型的工厂实现样板代码

例如:

public class Vehicle {
}

public class Car extends Vehicle {
    private final int numberOfPassengers;

    public Car(int numberOfPassengers) {
        this.numberOfPassengers = numberOfPassengers;
    } 
}

public interface VehicleFactory {
    Vehicle createPassengerVehicle(int numberOfPassengers);
}

@Configuration
public class CarFactoryConfiguration {
    @Bean
    VehicleFactory carFactory() {
        return new VehicleFactory() {
            @Override
            Vehicle createPassengerVehicle(int numberOfPassengers) {
                return new Car(numberOfPassengers);
            }
        };
    }
}

此答案的可能重复引用了一个静态工厂方法,该方法与
FactoryModuleBuilder
生成的工厂不同。非常有用!只有一个问题,在Guice中,我们可以将一个值传递给工厂,
@Assisted
one和所有其他依赖项都得到解决。例如,除了NumberOfPassenger之外,lets supose outrCar类取决于另一个服务类,该服务类被注入到构造函数中。使用Guice,VehicleFactory的参数numberOfPassagens用
@Assisted
注释,因为Car类用
@AssistedInject
注释,所有其他依赖项都已解决。Spring如何在不手动调用
@Bean
getter方法的情况下解决其他依赖项?
public class Vehicle {
}

public class Car extends Vehicle {
    private final int numberOfPassengers;

    public Car(int numberOfPassengers) {
        this.numberOfPassengers = numberOfPassengers;
    } 
}

public interface VehicleFactory {
    Vehicle createPassengerVehicle(int numberOfPassengers);
}

@Configuration
public class CarFactoryConfiguration {
    @Bean
    VehicleFactory carFactory() {
        return new VehicleFactory() {
            @Override
            Vehicle createPassengerVehicle(int numberOfPassengers) {
                return new Car(numberOfPassengers);
            }
        };
    }
}