在 Spring Boot 中访问外部配置的好习惯是啥?

Posted

技术标签:

【中文标题】在 Spring Boot 中访问外部配置的好习惯是啥?【英文标题】:What´s a good practice for accessing external configurations in Spring Boot?在 Spring Boot 中访问外部配置的好习惯是什么? 【发布时间】:2019-10-20 16:52:55 【问题描述】:

我正在设置一个 Spring Boot 应用程序,其中某些配置是从我的 application.yaml 文件中读取的。我以前做过几次,效果很好,但我想知道是否有更好的方法可以在运行时访问此配置,或者我是否通过不遵循一些最佳实践而产生了可能的问题。

现在提取配置的类被简单地定义为这样的组件:

@Component
@EnableConfigurationProperties
@ConfigurationProperties("myPrefix")
public class MyExternalConfiguration
    private HashMap<String, Boolean> entries= new HashMap<String, Boolean>();

    public Boolean getConfigurationForKey(String key) 
        return this.entries.get(key);
    

然后像这样自动连接到需要访问此配置的其他几个类:

@Component
public class MyClass
    @Autowired
    private MyExternalConfiguration myExternalConfiguration;

    public void doSomething()
        //...
        Boolean someEntry = myExternalConfiguration.getConfigurationForKey(someKey);
    

现在,这确实工作得很好。只是我已经看到了这样的配置作为单例处理的示例(尽管不是在 Spring-Boot 环境中)。我想问一下,是否有一些普遍接受的方式来访问外部配置,或者您是否发现我在项目中访问它的方式存在问题。

提前谢谢你!

【问题讨论】:

【参考方案1】:

Spring Boot 参考手册中有一整章是关于配置的:

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config

简单地说有两种访问配置的选项:

使用 Value 注释:

@Value("$name")
private String name;

或带有配置类的类型安全:

@ConfigurationProperties(prefix="my")
public class Config 

    private List<String> servers = new ArrayList<String>();

    public List<String> getServers() 
        return this.servers;
    

所以不需要自己去读取配置文件。

【讨论】:

Uhmm.... 但是第二次剪断你写的不是我的工作吗?它确实需要特定的类。我的问题是关于如何最好地访问进行阅读的所述班级的成员。 否,第二个片段是您将注入的类,它具有所有配置属性的 getter。它是类型安全的,而不是像您的示例中那样带有一些键的地图

以上是关于在 Spring Boot 中访问外部配置的好习惯是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot- Spring Boot特性2

Spring Boot2(011):外部化配置 Externalized Configuration

Spring Boot - 访问外部接口最全总结

Spring-Boot 访问外部接口的几种方案总结

Spring/Spring Boot的外部化配置

Spring Boot 中的外部化配置