spring @Value注释,继承和公共字段但不同的值

时间:2012-08-07 12:22:25

标签: java spring annotations

我有三个班,一个是超类。

class abstract Base {
   public abstract String getV();
}

class A extends Base {
   private String v;
   @Value("${A.v}") public String getV() { return v; };
}

class B extends Base {
   private String v;
   @Value("${B.v}") public String getV() { return v; };
}

有没有办法简化spring @Value注释的使用?我不想复制粘贴“v”字段声明和所有Base子节点的getter。到目前为止我得到的只是:

class abstract Base {
   protected String v;
   public String getV() { return v; };
   public abstract void setV(String v);
}

class A extends Base {
   @Value("${A.v}") public String setV(String v) { this.v = v;};
}

class B extends Base {
   @Value("${B.v}") public String setV(String v) { this.v = v;};
}

有没有更有效的方法?谢谢你的帮助。

2 个答案:

答案 0 :(得分:5)

我对此表示怀疑。注释不能是动态的。没有办法在抽象的setV方法上放置任何类型的注释,它将适应子类。你所做的一切都是正确的方法。

但是我会稍微修改你的代码:

class Base {
   private String v;
   public String getV() { return v; };
   public void setV(String v) { this.v = v; }
}

class A extends Base {
   @Value("${A.v}") public String setV(String v) { super.setV(v); }
}

class B extends Base {
   @Value("${B.v}") public String setV(String v) { super.setV(v); }
}

我的问题不仅出现在@Value注释中,还有@ Resource / @ Qualifier注释。

这是一个很大的原因,我不是自动装配的忠实粉丝。除了使用不同的限定符/值自动装配东西之外,我发现自己创建了一堆子类。

另一种替代方案可能是基于java的配置。我知道这与用XML做的并不是很大的差别,但我发现它比xml更干净,当然比覆盖你所有的setter更好。

@Configuration
public class MyConfig {
    @Value("${A.v}")
    private String av;

    @Value("${B.v}")
    private String bv;

    @Bean
    public A a() {
       A a = new A();
       a.setV(av);
    }


    @Bean
    public B b() {
       B b = new B();
       b.setV(bv);
    }
}

然后在你的XML中:

<context:annotation-config />
<bean class="MyConfig" />

答案 1 :(得分:0)

另一种方法:

class abstract Base {
    private String v;
    protected void configure(String v) {
        this.v = v;
    }
}

class A extends Base {
    @Value("${A.v}") private String v;

    @SuppressWarnings("unused")
    @PostConstruct
    private void configure() {
        super.configure(v);
    }
}

class B extends Base {
    @Value("${B.v}") private String v;

    @SuppressWarnings("unused")        
    @PostConstruct
    private void configure() {
        super.configure(v);
    }
}

这样,如果您需要在超类中设置许多值,则每个只需要一个实例变量,并且可以在configure方法中设置它们。当然,您不必强制实施configure!