我知道这个话题可能被视为offtopic或基于会议/意见,但我没有找到任何其他地方可以找到我的问题的解决方案。
我正在编写Spring应用程序,完全使用Java中的注释进行配置。我正在使用@PropertySource注释加载属性文件:
@Configuration
@ComponentScan("myapp.app")
@PropertySource("app.properties")
public class ApplicationConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer getPropertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
我们假设,我有以下内容的app.properties文件:
property1=someProperty1Value
property2=someProperty2Value
我正在使用以下代码加载此值:
@Service
public class MyServiceImpl implements MyService {
@Value("${property1}")
private String property1Value;
@Value("${property2}")
private String property2Value;
@Override
public void doStuff() {
System.out.println(property1Value);
System.out.println(property2Value);
}
}
这工作得非常好。另一方面,我发现很难维护 - 如果有人认为“property1”不是一个属性的最佳名称并想重命名它,那么将需要找到所有字符串“$ {property1}”并重命名它。我认为我可以把它提取到常数类:
public final class Properties {
public static final String PROPERTY_1 = "${property1}";
public static final String PROPERTY_2 = "${property2}";
private Properties() {
}
}
这需要将现有绑定重构为新的常量值:
@Value(Properties.PROPERTY_1)
private String property1Value;
看起来不错,但我不喜欢Properties类中的混乱,我认为没有手镯的常量值会更好:
public static final String PROPERTY_1 = "property1";
这导致MyServiceImpl类中的另一个重构:
@Value("${" + Properties.PROPERTY_1 + "}")
private String property1Value;
但是男孩,那真是太丑了。我考虑过向Enum提取常量值:
public enum Properties {
PROPERTY_1("property1"),
PROPERTY_2("property2");
private final String key;
private Properties(String key) {
this.key = key;
}
public String getKey() {
return key;
}
public String getSpringKey() {
return "${" + getKey() + "}";
}
}
并像
一样使用它@Value(Properties.PROPERTY_1.getSpringKey())
private String property1Value;
然后IDE提醒我,注释值必须是常量。
创建此枚举后,我认为我可能会过度思考它,并且应该尽可能简单。目前我回到了解决方案,其常量格式为
public static final String PROPERTY_1 = "${property1}";
最后,我想请你提供另一个漂亮的解决方案,或者我可以阅读一些常见解决方案的参考链接。