java - 通过接口(interface)公开单例类的正确方法

标签 java spring design-patterns singleton

我有一个单例类,它必须作为服务公开给使用接口(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
   }

}

现在如果我想通过接口(interface)公开这个类的所有服务,这是我的第一次尝试:

public interface MyServiceInterface{
    int methodA();
    MyServiceInterface getInstanceThroughService(); 
}

当 MySingleSingletonClass 实现这个接口(interface)时:

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 仍然会使用反射调用类的私有(private)承包商。这个实例仍然是单例吗?

其次,如果 Spring 已经给我实例,我看不到使用实例本身调用 getInstanceThroughService() 方法的意义。感觉这个实现有问题。

谢谢

最佳答案

典型的 spring bean 默认是单例的!

@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 - 一个消费者A - 一个消费者B

ConsumerAConsumerB 中的引用 mssc 将指向 MySingleSingletonClass 的同一个实例。

所以你不需要实现标准的单例模式,Spring 会为你做。

关于java - 通过接口(interface)公开单例类的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32956672/

相关文章:

java - 监听集合中的多个文档并更新recyclerview

java - Spring Security OAuth2 纯资源服务器

java - 设计模式的引用实现

java - 读取系统.Out

Java:检查变量类型

java - 如何通过类对象访问静态成员

java - MongoDB 无法使用复杂对象作为键值 Java

java - Spring Boot 2.1 中的 URI 模式匹配

java - 一次实例化一堆类的正确方法

c++ - 缓存方法结果时如何处理常量?