2009-12-18 49 views
1

因爲我已經有了application.properties,其中定義了數據庫連接設置,所以我決定在該文件中放置特定於應用程序的設置也是很好的選擇。一步 - 如春讀取這些屬性,我宣佈我的Settings豆如下使用spring配置應用程序屬性

<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; 
} 

現在,這看起來有點不對。但我想不出使用它的一個強有力的理由。 因此,要制定這個問題 - 是否有任何理由不使用我的方法,是否有更好的方法。

回答

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對象的重複,並且雖然靜態單例本身有點反模式,但代碼更有意義。

但是這是最好的,我可以在寒冷的寒冷週六早上:)

+0

還有下雪的呢? ;) 我做了類似於你的建議。但是我沒有使用工廠方法,而是使用了@PostConstruct方法,並說instance = this。 – Bozho 2009-12-19 12:59:06

0

這是一個很好的問題,我希望你能得到幾個明智的回答(比我期望寫的更好)。

使用這種方法的而不是的原因與首先採用Spring框架相同:控制反轉,鬆散耦合等。這就是說,我覺得如果你已經考慮了這些點這種情況下,但仍然覺得這種方法優雅地滿足您的實際需求,馬上行動。有時我覺得Spring--實際上許多領先的框架技術 - 允許自己陷入「我的道路或高速公路」API設計中,克服Spring限制的唯一方法是使用更多的Spring。

它不應該那樣。您應該能夠在現有項目中採用像Spring這樣的東西,而無需註冊重新構建應用程序的每一點。

事實上,在Spring和非Spring世界之間共享對象的方式(一個是你的)有365236種。沒有技術限制;但狂熱者會給你悲傷。

+0

嗯,我是一個春天狂熱自己。以前我一直在用我自己的類加載我的文件中的屬性,但後來我意識到我有兩個文件的設置,一般原則是我應該有一個。所以我依靠春天已經開發的解決方案。 – Bozho 2009-12-18 21:23:05

+0

如果每個文件都有一個明確定義的範圍,那麼有兩個配置文件的文件是沒有問題的(恕我直言)。但我懷疑你說你有兩個文件具有相同的信息,在這種情況下,我分享你的看法。 我也是Spring的大支持者。我在一切中都使用它。 – 2009-12-18 21:52:37

相關問題