java - 为什么对自动装配字段所做的更改会影响另一个类中的另一个自动装配字段?
问题描述
考虑以下示例代码:
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?我应该如何修改代码以便他们都获得自己的副本?Bus
SmallCar
我认为假设每次都返回一个新实例是安全的,但显然不是?考虑到可能的副作用,这不是更合理的设计吗?
解决方案
默认情况下,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;
}
推荐阅读
- python - dev_appserver.py 说未知运行时'python38'
- c# - 关于类或函数外的 c# 和字符串与类或函数内的字符串的问题
- reactjs - useEffect 获取暴雪 API
- python - Python:创建一个从数据集中提取一系列行的函数
- python - 清除 Paramiko ChannelFile
- flutter-provider - Flutter:如何从后台/服务更新小部件状态?
- javascript - object` ("[object Response]") 不能序列化为 JSON?
- swift - 列表属性的数组和列表
- go - 元帅时间。带小数位的时间
- javascript - 当我运行一个脚本时,它告诉我过滤器不是一个函数。[不和谐.js]