2014-03-04 85 views
8

我有一個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()); 
      } 
     } 
    } 
+0

你使用的是什麼版本的Spring?你是否包含? – user2793390

+0

我正在使用Spring 3.1.4。我不太瞭解的作用,但是我正在使用 skyman

回答

8

當你構造函數調用的load()的自動裝配Autowired的依賴仍然連線。接線在構造器完成後進行。可以使configService爲final,並使用構造函數自動裝配或從構造函數中移除load(),但使用@PostConstruct註釋load()。

+0

謝謝Dirk - 這有效!我已經將上面的工作代碼添加到了其他好處 - 非常感謝。 – skyman