由于我已经有了 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/