2012-08-07 33 views
1

我有三個類,一個是超類。spring @Value註解,繼承和常見字段但不同的值

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」字段聲明和所有基本孩子的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;}; 
} 

有沒有更有效的方法?謝謝你的幫助。

+0

A.v和B.v實際上是什麼? – 2012-08-07 13:25:36

+0

配置文件中有字段值的路徑。 自然地,「A.v」應該是「$ {A.v}」,與「B.v」相同。 – 2012-08-07 13:51:06

回答

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註釋,但@ @資源註解預選賽也。

這是一個很大的原因,我不是自動裝配的巨大粉絲。除了使用不同的限定符/值自動裝入事物之外,我發現自己無緣無故製造了一大堆子類。

另一種選擇可能是基於java的配置。我知道在XML中做這件事並不是一個巨大的偏差,但我發現它比xml更清潔,而且肯定比覆蓋所有設置器更好。

@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" /> 
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方法中全部設置它們。當然,你不是被迫執行配置!

+0

對不起 - 不理我。我應該先嚐試一下:-C:「顯式調用構造函數時不能引用實例字段wsdlUrl」。有點顯而易見,如果我想過它!可以使用@PostConstruct,但是你沒有強制執行,所以你回到了抽象方法! – DarthPablo 2012-10-05 13:07:14