[英]How can I make an existing Java class/interface implementation a singleton?
假設我在Spring中使用ApplicationContext實現。
ApplicationContext是Java Spring Framework中的接口,我無法更改它。
如何確保該實現只能有一個實例?
例如。 我有以下代碼-
public class ApplicationContextSingleton
{
private static ApplicationContext context;
private static int numberOfInstances = 0;
public static ApplicationContext getApplicationContext()
{
if(numberOfInstances == 0)
{
context = new ClassPathXmlApplicationContext("spring.xml");
numberOfInstances++;
}
return context;
}
}
這樣,我可以確保只有一個ApplicationContext實例,條件是按以下方式獲得它:
ApplicationContext context = ApplicationContextSingleton.getApplicationContext();
但這並不能阻止其他程序員說-
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
從而創建一個新的ApplicationContext。 如何防止這種情況發生?
您希望將ApplicationContext
設為單例,因此我用自己的自定義類覆蓋了該類,確保它首先出現在類路徑上,並使其具有私有構造函數。
也就是說,如果您不願意將其設置為單例。 正如其他答案和評論所指出的那樣,還有更好的方法可以解決您的問題。
應該注意的是,覆蓋庫片段通常不是一個好主意,因為這可能會在以后引起麻煩,尤其是當您嘗試升級框架版本時。
除非有人能提出一些新穎的創意,否則我認為沒有辦法。 這類似於嘗試將int
單例化。 只是不會發生,因為您無法控制未編寫的類的使用。 您將只需要信任您的開發人員就不會創建第二個上下文。
另外,我幾乎可以保證這是不可能的 ,但是您可以獲取spring的完整源代碼,進行一些代碼更改以使上下文成為單例,然后自行構建。 不太可能的解決方案,但是我覺得還是需要指出來。
之所以無法這樣做,是因為
Spring並未將ClassPathXmlApplicationContext實現為Singleton模式。 通知每個人您都有一種實用方法來訪問上下文對象,並且使用new創建上下文非常昂貴。
因此,您不能阻止他們這樣做,但是可以阻止他們將這些事情推送到您的開發,質量保證和產品環境中。 這似乎有些過分,但是這種過程將幫助開發人員完成數百項但不應該做的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.