为什么对自动装配字段所做的更改会影响另一个 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() {
//...
}
)
我发现如果 Bus
在 SmallCar
之后由 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;
}
考虑以下示例代码:
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() {
//...
}
)
我发现如果 Bus
在 SmallCar
之后由 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;
}