Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过接口公开单例类的正确方法_Java_Spring_Design Patterns_Singleton - Fatal编程技术网

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取而代之。