首页 > 解决方案 > 为什么对自动装配字段所做的更改会影响另一个类中的另一个自动装配字段?

问题描述

考虑以下示例代码:

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() {
        //...
    }
)

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

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

标签: javaspringautowired

解决方案


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

您必须将其声明CarEngine原型 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;
}

推荐阅读