3

私には3つのクラスがあり、1つはスーパークラスです。

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; };
}

春の@Valueアノテーションの使用を単純化する方法はありますか?すべてのBaseの子に対して、フィールド宣言とゲッターをコピーして貼り付けたくありません。私がこれまでに得たのは:

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 void setV(String v) { this.v = v;};
}

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

もっと効率的な方法はありますか?助けてくれてありがとう。

4

2 に答える 2

8

疑わしい。注釈を動的にすることはできません。サブクラスに適応する抽象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よりもクリーンであり、すべてのセッターをオーバーライドするよりも確かに優れています。

@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" />
于 2012-08-07T13:33:08.753 に答える
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);
    }
}

このように、スーパークラスに設定する必要のある値がたくさんある場合は、それぞれに1つのインスタンス変数のみが必要であり、configureメソッドでそれらすべてを設定できます。確かに、configureを実装する必要はありません。

于 2012-10-05T13:01:10.463 に答える