Spring中实现两个子类共享父类同一份内存引用的方案咨询
解决Spring中子类共享父类库存实例的问题
核心思路
将共享的车辆库存封装为独立的单例Spring Bean,让抽象父类依赖这个Bean。由于Spring单例Bean在容器中仅存在一个实例,所有子类的父类部分都会引用同一个库存对象,从而实现共享访问和修改。
具体实现步骤
1. 封装库存为单例Bean
创建专门的库存持有类,负责初始化和管理车辆库存,通过Spring依赖注入获取Tesla Bean并完成库存初始化:
@Component public class TeslaInventory { private List<Car> inventory; @Autowired public TeslaInventory(Tesla tesla) { // 仅在Bean创建时执行一次初始化 this.inventory = tesla.getCars(); } // 提供库存访问方法 public List<Car> getInventory() { return inventory; } // 按需添加库存修改方法 public void addCar(Car car) { inventory.add(car); } public void removeCar(Car car) { inventory.remove(car); } }
2. 修改抽象父类
在抽象父类中注入上述库存Bean,子类可直接继承使用该引用:
public abstract class TeslaServiceCenter { // 注入单例库存Bean,所有子类共享同一实例 @Autowired protected TeslaInventory inventoryHolder; // 保留抽象方法,强制子类实现业务逻辑 public abstract void doService(); }
3. 子类实现
子类无需单独注入Tesla Bean,直接通过父类继承的inventoryHolder操作共享库存:
@Component public class OhioServiceCenter extends TeslaServiceCenter { @Override public void doService() { List<Car> sharedCars = inventoryHolder.getInventory(); // 执行俄亥俄服务中心的业务逻辑,如库存检查、车辆维修等 } } @Component public class FloridaServiceCenter extends TeslaServiceCenter { @Override public void doService() { List<Car> sharedCars = inventoryHolder.getInventory(); // 执行佛罗里达服务中心的业务逻辑 } }
方案优势
- 保留父类抽象性:父类仍为抽象类,可定义抽象
doService方法强制子类实现业务逻辑。 - 实现真正共享:所有子类依赖同一个
TeslaInventory单例Bean,库存对象内存地址唯一,避免重复实例造成的内存浪费。 - 符合Spring设计理念:通过依赖注入管理共享资源,规避静态变量带来的初始化顺序、测试困难等问题。
内容的提问来源于stack exchange,提问作者Vaibhav Jain
相关产品推荐
相关产品推荐

