我有三个班,一个是超类。
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;};
}
有没有更有效的方法?谢谢你的帮助。
答案 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!