使用spring配置应用程序属性

时间:2009-12-18 20:41:27

标签: 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;
}

现在,这看起来有点不对劲。但我想不出没有使用它的强烈理由。 所以要提出问题 - 是否有任何理由不使用我的方法,并且有更好的方法。

2 个答案:

答案 0 :(得分: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对象,虽然静态单例本身就是一个反模式,但代码更有意义。

但这是我在周六早上寒冷的时候能想到的最好的事情:)

答案 1 :(得分:0)

这是一个很好的问题,我希望你能得到一些明智的,有充分理由的回答(比我预期的那样好)。

使用这种方法的原因与首先采用Spring框架的原因相同:控制反转,松散耦合等。那就是说,如果你有,我觉得在这种情况下考虑了这些观点,但仍然认为这种方法能够优雅地满足您的实际需求,请继续前进。

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

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

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