【问题标题】:Access parent fields config properties from child class从子类访问父字段配置属性
【发布时间】:2022-12-11 10:07:38
【问题描述】:

我有以下课程:

父类

@Configuration
public class Parent{
    boolean foo;
}

子类

@Configuration
@Configuration(prefix = "text.prop")
public class Child extends Parent{
    int num;
}

Child2.类

@Configuration
@Configuration(prefix = "text.prop2")
public class Child2 extends Parent{
    int num;
}

应用程序.yml:

text:
    prop:
        foo: true
        num: 67
    prop2:
        foo: false
        num: 67

当我自动连接 Child.class 时,字段 foo 的值未从 application.yml 初始化

有没有更好的方法来做到这一点?或者我如何在弹簧初始化Child.class时访问字段foo

【问题讨论】:

  • 使用聚合而不是继承
  • 我如何在这里使用聚合?我有不同的子类和相同的父类。例如:A 类和 B 类都扩展了 C 类

标签: java spring spring-boot configuration autowired


【解决方案1】:

我做了以下测试,它看起来有效:

public class Parent {
    private boolean foo;

    public boolean isFoo() {
        return foo;
    }

    public Parent setFoo(boolean foo) {
        this.foo = foo;
        return this;
    }
}

和孩子班级:

@Configuration
@ConfigurationProperties(prefix = "text.prop")
public class Child extends Parent{
    private int num;

    public int getNum() {
        return num;
    }

    public Child setNum(int num) {
        this.num = num;
        return this;
    }

    @Bean
    public String dummyBean(){
        System.out.println(num);
        System.out.println(isFoo());
        return "dummyBean";
    }
}

对于 child2,我们有:

@Configuration
@ConfigurationProperties(prefix = "text.prop2")
public class Child2 extends Parent{
    private int num;

    public int getNum() {
        return num;
    }

    public Child2 setNum(int num) {
        this.num = num;
        return this;
    }

    @Bean
    public String dummyBean2(){
        System.out.println(num);
        System.out.println(isFoo());
        return "dummyBean";
    }
}

控制台中打印的值:

67
true
67
false

如果Parent类是@Configuration类,将@AutoConfigureAfter(value = {Parent.class})添加到子类

【讨论】:

  • 它之所以有效,是因为您在父类中添加了“text.prop”。
  • 我已经编辑了问题。如果有不同的子类,它将不起作用
  • @vinter 还是没用??
  • 你为什么要在 setter 中返回 Child 类型?
  • @vinter实际上它是由IDE生成的,这里是多余的。
【解决方案2】:

为此,您需要在父类中定义 getter 和 setter。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    相关资源
    最近更新 更多