3

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

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注解的使用?我不想复制粘贴字段声明和所有 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 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 更干净,而且肯定比覆盖所有的 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" />
于 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);
    }
}

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

于 2012-10-05T13:01:10.463 回答