Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.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是否可以在不使用构造函数的情况下基于限定符注释创建不同配置的bean?_Java_Spring_Dependency Injection - Fatal编程技术网

Java Spring是否可以在不使用构造函数的情况下基于限定符注释创建不同配置的bean?

Java Spring是否可以在不使用构造函数的情况下基于限定符注释创建不同配置的bean?,java,spring,dependency-injection,Java,Spring,Dependency Injection,我想要的是配置两个或更多具有稍微不同的内部依赖关系的单例 假设我有一辆车: @Component public Car { @Inject private Engine engine; @Inject private Chassis chassis; } 现在,发动机有两种型号,@标准型和@power型 我想要的是注入一辆车,并用@Standard或@power来限定这一注入,而实际上不需要自己创建两个汽车实例 换句话说,当我写作时: @Inject @Powerful Car

我想要的是配置两个或更多具有稍微不同的内部依赖关系的单例

假设我有一辆车:

@Component
public Car {
    @Inject private Engine engine;
    @Inject private Chassis chassis;
}
现在,发动机有两种型号,@标准型和@power型

我想要的是注入一辆车,并用@Standard或@power来限定这一注入,而实际上不需要自己创建两个汽车实例

换句话说,当我写作时:

@Inject @Powerful Car car;
@Inject @Standard Car car;
我想让Spring创建或使用现有的带有标准底盘和强大引擎的singleton汽车

但当我写作时:

@Inject @Powerful Car car;
@Inject @Standard Car car;
我希望Spring创建或使用现有的带有标准底盘和标准发动机的单体车

到目前为止,我只能通过给Car一个构造函数并自己在@Configuration类中完成这项工作来管理它。对于这个例子来说,这是可以的,但是如果汽车有10次注射的话,那就很烦人了

@Bean @Powerful
public Car car1() {
    return new Car(new PowerfulEngine(), new Chassis());
}

@Bean @Standard
public Car car1() {
    return new Car(new StandardEngine(), new Chassis());
}

@Bean @Standard @Sedan
public Car car1() {
    return new Car(new StandardEngine(), new SedanChassis());
}

etc...
一定有更简单的方法

Spring可以为我创建这两个bean吗?如果有3种发动机类型,那还要更多吗?或者3种发动机类型和5种底盘类型,这意味着可以有15种不同配置的汽车对象

即:


其中@Sedan是一种底盘变型…

不,Spring没有这种内置功能。确认@SotiriosDelimanolis声明,没有通过这种Spring功能。Spring如何知道您的@Sedan引用了SedanChassis?好吧,也许你可以通过思考来做到这一点,我不理解你问题的所有细节。它会知道这一点,因为相应的发动机/底盘等也用相同的注释来注释@Sedan表示底盘或@power表示发动机。