簡體   English   中英

通過接口公開單例類的正確方法

[英]proper way of exposing singleton class through interface

我有一個單例類,必須使用接口將它作為服務公開給其他應用程序。

例如:

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仍會使用反射來調用該類的私有承包商。 這個實例還會是單例嗎?

其次 ,如果Spring已經為我提供了實例,則我看不到使用實例本身調用getInstanceThroughService()方法的意義。 感覺此實現存在問題。

謝謝

默認情況下,典型的春豆是單例!

@Service
public class MySingleSingletonClass{

   public int methodA(){...}
}

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

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

在這種情況下,您將擁有3個bean:-一個MySingleSingletonClass-一個ConsumerA-一個ConsumerB

ConsumerAConsumerB的引用mssc將指向MySingleSingletonClass的SAME實例。

因此,您無需實現標准的Singleton模式,Spring會為您完成。

您可以使用spring的工廠方法http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html告訴Spring使用getInstanceThroughService()來獲取新實例,而您又可以使用將提供相同的緩存實例,從而保持您的單例。

但是,如果您使用的是Spring,則無需自己維護單例對象。 Spring會自動執行此操作(當然,除非在同一jvm / classloader中在Spring容器外部使用您的類,否則當然)。

Spring是一個框架,可實現稱為控制反轉 (或IoC)的設計模式。 IoC的一個應用程序是允許外部框架配置和實例化應用程序的各個部分,的確,這是Spring bean的功能。 Spring Bean允許您使用配置文件配置應用程序資源,並在應用程序中訪問這些資源。

Singleton(和原型bean)由Spring管理,因此不需要自己實現Singleton設計模式。 您只需要創建一個Spring兼容的bean並在Spring配置中聲明它即可。 然后,您可以從應用程序上下文訪問它。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM