2015-10-05 54 views
1

我有一個單例類,必須作爲服務公開給其他使用接口的應用程序。通過接口暴露單例類的正確方法

例如:

public class MySingleSingletonClass{ 

    private static final MySingleSingletonClass THIS_INSTANCE = new MySingleSingletonClass(); 

    private MySingleSingletonClass() {} 

    public static MySingleSingletonClass getInstance(){ 
     return THIS_INSTANCE; 
    } 

    //do other staff 
    public int methodA(){ 
    //some service 
    } 

} 

現在,如果我要揭露這個類通過接口的所有服務,這是我第一次嘗試:

public interface MyServiceInterface{ 
    int methodA(); 
    MyServiceInterface getInstanceThroughService(); 
} 

當MySingleSingletonClass實現了這個接口:

public class MySingleSingletonClass implements MyServiceInterface{ 

    private static final MySingleSingletonClass THIS_INSTANCE = new MySingleSingletonClass(); 

    private MySingleSingletonClass() {} 

    public static MySingleSingletonClass getInstance(){ 
     return THIS_INSTANCE; 
    } 

    @Override 
    public int methodA(){ 
    //some service 
    } 

    @Override 
    MyServiceInterface getInstanceThroughService(){ 
    return MySingleSingletonClass.getInstance(); 
    } 

} 

我看到這種實現有兩個問題,

第一個如果我使用像Spring這樣的框架,並且我嘗試獲取類型爲MyServiceInterface的bean,那麼該類將如何實例化?我讀過那個春天仍然會用反思來呼叫這個班級的私人承包商。這個例子還會是單身嗎?

第二個,如果Spring已經給我這個實例了,我沒有看到使用實例本身調用getInstanceThroughService()方法的要點。感覺這個實現有問題。

謝謝

回答

4

默認情況下,典型的spring beans是singletons!

@Service 
public class MySingleSingletonClass{ 

    public int methodA(){...} 
} 

@Service 
public class ConsumerA{ 
    @Autowired 
    private MySingleSingletonClass mssc; 
} 

@Service 
public class ConsumerB{ 
    @Autowired 
    private MySingleSingletonClass mssc; 
} 

在這種情況下,你將有3種豆: - ONE MySingleSingletonClass - 一個ConsumerA - 一個ConsumerB

ConsumerAConsumerB參考mssc將指向MySingleSingletonClass同一個實例。

所以你不需要必須實現standart singleton模式,Spring會爲你做。

+0

想象不能訪問ConsumerA/ConsumerB中的MySingleSingletonClass,只能通過MyServiceInterface訪問服務。在這種情況下如何處理? - 謝謝 – LeTex

+1

@LeTex:那麼'MySingleSingletonClass'必須實現'MyServiceInterface',兩個消費者都會使用'@Autowired private MyServiceInterfaces mssc;'來代替。 – Ralph

0

你可以使用spring的工廠方法http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html來告訴spring使用getInstanceThroughService()來獲取新的實例,而這些實例又會給出相同的緩存實例,從而維護你的單例。

但是,如果你使用彈簧,那麼你不需要自己維護單身物件。 Spring會自動執行它(除非你的類正在Spring容器之外的同一個jvm/classloader中使用)。

0

Spring是一個實現名爲inversion of control(或IoC)的設計模式的框架。 IoC的一個應用是允許外部框架配置和實例化應用程序的部分,實際上,這是Spring bean的功能。 Spring bean允許您使用配置文件配置應用程序資源並訪問應用程序中的這些資源。

單身人士(和原型豆)由春天管理,所以你不需要自己實現Singleton設計模式。你只需要創建一個Spring兼容的bean並在Spring配置中聲明它。然後您可以從應用程序上下文訪問它。

您的bean仍然可以像通常那樣實現一個接口,並且您可以在應用程序中使用該接口。