gpt4 book ai didi

java - 为什么对 Autowiring 字段所做的更改会影响另一个类中的另一个 Autowiring 字段?

转载 作者:行者123 更新时间:2023-12-01 19:35:36 25 4
gpt4 key购买 nike

考虑以下示例代码:

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 为两个类返回相同的 bean?我应该如何修改代码以便它们都获得自己的副本?

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

最佳答案

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

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

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

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

@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;
}

关于java - 为什么对 Autowiring 字段所做的更改会影响另一个类中的另一个 Autowiring 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57764444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com