[英]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.