我有一個Spring應用程序,它使用持久化在數據庫中的各種配置參數。爲了最大限度地減少數據庫訪問週期,我創建了一個Singleton類,它在Properties對象中保存參數。在應用程序運行期間,有時候需要刷新Properties對象,所以爲此我有一個load()方法和一個reload()方法。要訪問數據庫,我有一個@Autowired服務對象。簡化了一點:Spring @Autowired和Singletons
public class AppConfig {
private static AppConfig instance = null;
private Properties appProperties;
@Autowired ConfiguraitonService configService;
protected AppConfig() {
load();
}
public static AppConfig getInstance() {
if (instance == null) {
instance = new AppConfig();
}
return instance;
}
public void reload() {
load();
}
private void load() {
List<Configuration> configList configService.findAll()
for (Configuration myConfiguration : configList) {
if (myConfiguration != null && myConfiguration.getAttribute() != null) {
appProperties.setProperty(myConfiguration.getAttribute(),myConfiguration.getValue());
}
}
}
public String getValue(String key) {
return appProperties.getProperty(key);
}
在Spring配置文件中,我有:
<bean id="appConfigBean" class="foo.bar.AppConfig"></bean>
呼喚 '的getValue' 反對這種辛格爾頓產生一個空指針異常。我知道這在某種程度上與@Autowired連接,並且未能正確初始化,但我不明白爲什麼。我想我的問題涉及解決此問題的最佳方法。
對於其他人來說,這是修改後的代碼工作:
public class AppConfig {
private static Properties myProperties = new Properties();
@Autowired
private ConfigurationService configService;
private static AppConfig instance = null;
protected AppConfig() {
}
public static AppConfig getInstance() {
if (instance == null) {
instance = new AppConfig();
}
return instance;
}
@PostConstruct
public void load() {
List<Configuration> configList = configService.findAll();
for (Configuration myConfiguration : configList) {
if (myConfiguration != null && myConfiguration.getAttribute() != null) {
myProperties.setProperty(myConfiguration.getAttribute(), myConfiguration.getValue());
}
}
}
你使用的是什麼版本的Spring?你是否包含 ? –
user2793390
我正在使用Spring 3.1.4。我不太瞭解 的作用,但是我正在使用 –
skyman