【问题标题】:Using spring to configure application properties使用spring配置应用程序属性
【发布时间】:2009-12-18 20:41:26
【问题描述】:

由于我已经有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;
}

现在,这看起来有点不对劲。但我想不出不使用它的充分理由。 所以要提出这个问题 - 有什么理由不使用我的方法,还有更好的方法吗?

【问题讨论】:

    标签: java spring


    【解决方案1】:

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

    我的直觉是在不牺牲 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 对象的重复,虽然静态单例本身有点反模式,但代码更有意义。

    但这是我在寒冷的星期六早上能想到的最好的方法:)

    【讨论】:

    • 还有下雪的? ;) 我做了类似于你的建议。但是我没有使用工厂方法,而是使用了@PostConstruct 方法,即instance = this。
    【解决方案2】:

    这是一个很好的问题,我希望你能得到一些有根据且有充分理由的回答(比我预期的要好)。

    使用这种方式的原因和当初采用Spring框架的原因是一样的:控制反转、松耦合等。也就是说,我觉得如果你已经在这种情况下考虑了这些要点,但仍然觉得这种方法可以优雅地满足您的实际需求,请继续。

    有时我觉得 Spring——实际上是许多领先的框架和技术——允许自己陷入“我的方式或高速公路”的 API 设计,其中克服 Spring 限制的唯一方法是使用更多的 Spring。

    不应该这样。您应该能够在现有项目中采用 Spring 之类的东西,而无需注册重新构建应用程序的每一部分。

    事实上,在 Spring 和非 Spring 世界之间共享对象有 365236 种方式(您的合二为一)。没有技术限制;但是狂热者会给你带来悲伤。

    【讨论】:

    • 好吧,我自己也是个春季狂热者。以前我一直在使用自己的类从文件中加载属性,但后来我意识到我有 2 个带有设置的文件,一般原则是我应该有一个。所以我依靠 spring 已经开发的解决方案。
    • 如果每个文件都有明确定义的范围,那么拥有 2 个具有配置设置的文件并没有犯规(恕我直言)。但我怀疑你是说你有 2 个文件具有相同的信息,在这种情况下,我同意你的观点。我也是 Spring 的忠实支持者。我什么都用它。
    猜你喜欢
    • 2015-11-21
    • 2016-05-26
    • 2015-09-21
    • 2022-09-25
    • 2019-03-18
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多