为什么对自动装配字段所做的更改会影响另一个 class 中的另一个自动装配字段?

Why does changes made to a autowired field affect another autowired field in another class?

考虑以下示例代码:

public class SmallCar {
    private CarEngine carEngine;

    @Autowired
    public SmallCar(CarEngine carEngine) {
        carEngine.setBrand("Brand A");
        this.carEngine = carEngine;
    }

    public void printInfo() {
        carEngine.printBrand();
        carEngine.printStatus();
    }
}

public class Bus {
    private CarEngine carEngine;

    @Autowired
    public Bus(CarEngine carEngine) {
        carEngine.setBrand("Brand B");
        this.carEngine = carEngine;
    }

    public void printInfo() {
        //...
    }
)

我发现如果 BusSmallCar 之后由 spring 处理,SmallCar.printInfo() 会打印出 "Brand B"。这是否意味着 Spring 为两个 class 返回相同的 bean?我应该如何修改代码以便他们都得到自己的副本?

我认为假设每次都返回一个新实例是安全的,但显然不是这样?考虑到可能的副作用,这不是更合理的设计吗?

默认情况下,Spring 中的每个 bean 都是单例。但是,这是可以改变的。

您必须将 CarEngine 声明为 prototype bean...

@Bean(scope = "prototype")
public CarEngine carEngine() {
   // car engine here
}

...或者理想情况下,有两个 CarEngine 个不同品牌的豆子。

@Bean(name = "brandA")
public CarEngine carEngine1() { }

@Bean(name = "brandB")0
public CarEngine carEngine2() { }

然后您可以将它们与 @Qualifier 一起使用。

@Autowired
public SmallCar(@Qualifier("brandA") CarEngine carEngine) {
    this.carEngine = carEngine;
}

@Autowired
public Bus(@Qualifier("brandB") CarEngine carEngine) {
    this.carEngine = carEngine;
}