[英]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
ConsumerA
和ConsumerB
的引用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.