我有一个单例类,必须使用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已经给我实例,我没有看到使用实例本身调用getInstanceThroughService()方法的意义。感觉这个实现存在问题。
谢谢
答案 0 :(得分:4)
默认情况下,典型的春豆是单身!
@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: - ONE MySingleSingletonClass - 一名消费者A. - 一个ConsumerB
mssc
和ConsumerA
中的引用ConsumerB
将指向MySingleSingletonClass
的SAME实例。
所以你不需要实现标准的Singleton模式,Spring会为你做。
答案 1 :(得分:0)
你可以使用spring的工厂方法http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html来告诉spring使用getInstanceThroughService()来获取新的实例,而这些实例又会给你相同的缓存实例,从而维护你的单例。
但是,如果你使用spring,那么你不需要自己维护单例对象。 Spring会自动执行此操作(除非您的类在同一个jvm / classloader中的spring容器之外使用)。
答案 2 :(得分:0)
Spring是一个实现名为inversion of control(或IoC)的设计模式的框架。 IoC的一个应用是允许外部框架配置和实例化应用程序的各个部分,实际上,这是spring bean的功能。 Spring bean允许您使用配置文件配置应用程序资源,并访问应用程序中的这些资源。
Singletons(和原型bean)由spring管理,因此不需要自己实现Singleton设计模式。您只需要创建一个符合Spring的bean并在Spring配置中声明它。然后,您可以从应用程序上下文中访问它。
您的bean仍然可以像往常一样实现接口,并且您可以在应用程序中使用该接口。