我有一个单例类,它必须作为服务公开给使用接口(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
ConsumerA
和 ConsumerB
中的引用 mssc
将指向 MySingleSingletonClass
的同一个实例。
所以你不需要实现标准的单例模式,Spring 会为你做。
关于java - 通过接口(interface)公开单例类的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32956672/