由于我已经定义了数据库连接设置的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;
}
现在,这看起来有点不对劲。但我想不出没有使用它的强烈理由。 所以要提出问题 - 是否有任何理由不使用我的方法,并且有更好的方法。
答案 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种方式(在一种方式中)。没有技术限制;但是狂热者会给你带来悲伤。