Java 通过接口公开单例类的正确方法
我有一个单例类,它必须作为服务公开给使用接口的其他应用程序 例如:Java 通过接口公开单例类的正确方法,java,spring,design-patterns,singleton,Java,Spring,Design Patterns,Singleton,我有一个单例类,它必须作为服务公开给使用接口的其他应用程序 例如: public class MySingleSingletonClass{ private static final MySingleSingletonClass THIS_INSTANCE = new MySingleSingletonClass(); private MySingleSingletonClass() {} public static MySingleSingletonClass g
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();
}
当MySingleSingleToClass实现此接口时:
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仍然会使用reflection给班级的私人承包商打电话。这个实例仍然是singleton吗
其次,如果Spring已经给了我实例,我看不出使用实例本身调用getInstanceThroughService()方法的意义。感觉这个实现有问题
谢谢典型的SpringBean默认为单例
@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:
-一个神秘的课堂
-一个消费者
-一个消费者b
ConsumerA
和ConsumerB
中的参考mssc
将指向MySingleSingletonClass
的相同实例
因此,您不需要实现标准的单例模式,Spring将为您实现。您可以使用Spring的工厂方法告诉Spring使用getInstanceThroughService()获取新实例,然后您将提供相同的缓存实例,从而维护单例
但是,如果您使用的是spring,那么您不需要自己维护singleton对象。Spring会自动执行此操作(当然,除非您的类在同一jvm/classloader中的Spring容器之外使用) Spring是一个框架,它实现了一个名为(或IoC)的设计模式。IoC的一个应用程序是允许外部框架配置和实例化应用程序的一部分,实际上,这是Springbeans的功能。Springbeans允许您使用配置文件配置应用程序资源,并访问应用程序中的这些资源 单例(和原型bean)由spring管理,因此不需要自己实现单例设计模式。您只需要创建一个与Spring兼容的bean并在Spring配置中声明它。然后可以从应用程序上下文访问它
您的bean仍然可以实现正常情况下的接口,并且您可以在应用程序中使用该接口。假设您无法访问ConsumerA/ConsumerB中的MySingleSingleToClass,您只能通过MyServiceInterface访问该服务。在这种情况下将如何处理感谢you@LeTex:那么
MySingleSingletonClass
必须实现MyServiceInterface
,两个消费者都将使用@Autowired private MyServiceInterfaces mssc代码>取而代之。