更可读的Spring @Value参数

时间:2017-05-15 09:45:49

标签: java configuration spring-4

我知道这个话题可能被视为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}";

最后,我想请你提供另一个漂亮的解决方案,或者我可以阅读一些常见解决方案的参考链接。

0 个答案:

没有答案