java - Spring Boot 配置是否带有预设默认值?

标签 java spring-boot configuration

在 Spring Boot 2.1 中使用配置时,我一直在思考如何实现正确的配置管理的问题,其中我既有属性文件中的参数,也有配置参数的硬编码值,以及每个参数的默认值。最后,我需要对每个参数进行某种“完整性检查”,例如检查整数是否在指定范围内。

虽然这看起来很简单,但实现起来却相当臃肿且违反直觉。

我的最小示例如下所示:

应用程序.yml

param1=42

配置.java

@Configuration
@PropertySource("classpath:application.yml")
public class Config {
    private static final int DEFAULT_PARAM1 = 1;
    private static final int PARAM1_MIN = 1;
    private static final int PARAM1_MAX = 5;

    @Autowired
    private int param1;

    public int getParam1() {
        return param1;
    }

    @PostConstruct
    public void init() {
        if(param1 == null || !checkParam1(param1)) param1 = DEFAULT_PARAM1;
    }

    public boolean checkParam1(param)
    {
        if(param > PARAM1_MIN || param < PARAM1_MAX)
            return true;
        else return false;
    }

    public void set setParam1(int param) {
        if(checkParam1(param))
            param1 = param;
    }
}

现在,这似乎是一个非常多的代码来简单地设置一个参数。有没有更优雅、更 slim 、更精简的方法来做到这一点?

最佳答案

你必须使用 SpEL(Spring 表达式语言),一个非常强大的工具:)

你可以做这样的事情:

@Value("#{${my.param} > PARAM1_MIN || ${my.param} < PARAM1_MAX  ? ${my.param} : DEFAULT_PARAM1"})
private int param; 

或者也许更具可读性:

 @Value("#{checker.inRange(${my.param})}")
 private int param;

带有组件:

@Component("checker")
    private class PropertyChecker {
       public int inRange(int param) {
        ......
        }
    }

这里有一个很好的教程:https://www.baeldung.com/spring-expression-language 或:https://www.baeldung.com/spring-value-annotation

关于java - Spring Boot 配置是否带有预设默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55533756/

相关文章:

java - Gradle 5 中是否有 dependencyManagement.importedProperties 的替代品?

java - 如何向 Android 导航添加自定义按钮和文本? (以 X 身份登录)

java - 拆分数组

java - 如何从另一个 Maven 模块启动 Spring Boot 应用程序?

design-patterns - 处理具有项目之间共享依赖关系的 IoC 配置

url - Grails重定向到appName为空映射的URL

java - 配置 Spring + Hibernate 事务管理器

java - Spring中具有动态参数值的 Autowiring 类

java - java.net.Socket.setSoTimeout 可靠吗?

java - SpringBoot 应用程序中的每个 @Service 类是否应该实现一个接口(interface)