java - 使用spring配置应用程序属性

标签 java spring

由于我已经有了 application.properties,其中定义了数据库连接设置,因此我决定将应用程序特定的设置也放在该文件中。更进一步 - 当 spring 读取这些属性时,我声明了我的 Settings bean,如下所示

<bean name="settingsBean" class="com.tickets.constants.Settings">
    <property name="settings">
        <props>
            <prop key="backup.dir">${backup.dir}</prop>
            <prop key="smtp.host">${smtp.host}</prop>
        </props>
    <property>
 </bean>

现在,有时会发生这样的情况,我需要一些不直接在 spring 上下文中的类中的属性。是的 - 我可以从我的 Web 应用程序上下文中获取 spring 上下文,或者将设置作为方法参数传递给实用程序类,但这是我的替代方法(这是 Settings 类):

private static Properties staticSettings;

@PostConstruct
public void init() {
    // making the settings available for static access
    staticSettings = settings;
}

现在,这看起来有点不对劲。但我想不出不使用它的有力理由。 因此,要提出这个问题 - 有没有理由不使用我的方法,以及是否有更好的方法。

最佳答案

你是对的,你的解决方案“感觉”错误 - 静态和实例的交互看起来像一种反模式,但它有点难以掌握。

我的直觉是进一步插入静态,并使类本身在内部更加一致,而不牺牲 Spring 集成:

public class Settings {

    private static Settings instance;

    public static Settings initialise(Properties settings) {
        instance = new Settings(settings);
        return instance;
    }

    public static Settings get() {
        return instance;
    }

    private final Properties settings;

    private Settings(Properties settings) {
        this.settings = settings;
    }

    public String getProperty(String key) {
        return settings.getProperty(key);
    }
}

您的 Spring 配置将使用 factory-method="initialise" 而不是构造函数,其他代码可以使用静态 get() 方法来检索单例。您可以避免重复 Properties 对象,虽然静态单例本身有点反模式,但代码更有意义。

但这是我在寒冷的周六早上能想到的最好的办法了:)

关于java - 使用spring配置应用程序属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1930565/

相关文章:

Spring Boot 和多模块 Maven 项目

java - 在没有 spring security 的情况下,如何使用 spring boot + JPA 进行简单登录

java - 避免在anyElement上重复命名空间定义

java - 表的外键值在 Hibernate 5 中不会自动更新

java - 在errorHandler中处理异常后,如何在Controller或Route中获取错误信息?

Java Spring : benefits of POJO objects

java - 用于业务逻辑和数据库连接的 Junit Spring Boot 单元测试

java - 为什么我的 xml 的 JAXB namespace 设置为默认 ns1?

java - JFreechart 右键单击​​ XYItemEntity

spring - @InjectParam 没有按预期工作