首页
学习
活动
专区
圈层
工具
发布

类继承
EN

Stack Overflow用户
提问于 2016-11-01 20:15:51
回答 1查看 1.8K关注 0票数 3

在Spring配置类中可以使用继承吗?如果是的话,如何做到这一点?

例如:

代码语言:javascript
复制
@ConfigurationProperties(prefix="my-config")
public class Config {
    List<Vehicle> vehicles;
}

类(或接口) "Vehicle“有两个实现:卡车和汽车。所以YAML看起来可能是:

代码语言:javascript
复制
my.config.vehicles:
  -
    type: car
    seats: 3
  -
    type: truck
    axles: 3
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-02 02:48:49

我认为这是不可能的(至少据我所知)。但是,您可以按照以下方式设计代码:

将属性注入Builder对象

用所有属性定义一个对象,我们将其称为VehicleBuilder (或工厂,您选择它的名称)。VehicleBuilders是从Yaml注入的。然后,您可以在@PostConstruct块中检索每个构建器的车辆。守则:

代码语言:javascript
复制
@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());
    }
}

建造者:

代码语言:javascript
复制
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;
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40367935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档