Spring Boot YML配置类继承



是否可以在Spring Boot YML配置类中使用继承?如果可以,如何实现?

例如:

@ConfigurationProperties(prefix="my-config")
public class Config {
    List<Vehicle> vehicles;
}

类(或接口)"Vehicle"有两种实现:Truck和Car。所以YAML可能看起来像:

my.config.vehicles:
  -
    type: car
    seats: 3
  -
    type: truck
    axles: 3

我认为这是不可能的(至少我不知道)。然而,你可以这样设计你的代码:

将属性注入Builder对象

定义一个具有所有属性的对象,我们将其称为VehicleBuilder(或工厂,您选择其名称)。VehicleBuilders从Yaml注入。然后你可以在@PostConstruct块中检索每个建设者的车辆。代码:

@ConfigurationProperties(prefix="my-config")
@Component
public class Config {
    private List<VehicleBuilder> vehicles = new ArrayList<VehicleBuilder>();
    private List<Vehicle> concreteVehicles;
    
    public List<VehicleBuilder> getVehicles() {
        return vehicles;
    }
    
    public List<Vehicle> getConcreteVehicles() {
        return concreteVehicles;
    }
    @PostConstruct
    protected void postConstruct(){
        concreteVehicles = vehicles.stream().map(f -> f.get())
                                   .collect(Collectors.<Vehicle>toList());
    }
}

构建器:

public class VehicleBuilder {
    private String type;
    private int seats;
    private int axles;
    public Vehicle get() {
        if ("car".equals(type)) {
            return new Car(seats);
        } else if ("truck".equals(type)) {
            return new Trunk(axles);
        }
        throw new AssertionError();
    }
    public void setType(String type) {
        this.type = type;
    }
    public void setSeats(int seats) {
        this.seats = seats;
    }
    public void setAxles(int axles) {
        this.axles = axles;
    }
}

最新更新