2015-10-05 106 views
1

我有一个单例类,必须作为服务公开给其他使用接口的应用程序。通过接口暴露单例类的正确方法

例如:

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()方法的要点。感觉这个实现有问题。

谢谢

回答

4

默认情况下,典型的spring beans是singletons!

@Service 
public class MySingleSingletonClass{ 

    public int methodA(){...} 
} 

@Service 
public class ConsumerA{ 
    @Autowired 
    private MySingleSingletonClass mssc; 
} 

@Service 
public class ConsumerB{ 
    @Autowired 
    private MySingleSingletonClass mssc; 
} 

在这种情况下,你将有3种豆: - ONE MySingleSingletonClass - 一个ConsumerA - 一个ConsumerB

ConsumerAConsumerB参考mssc将指向MySingleSingletonClass同一个实例。

所以你不需要必须实现standart singleton模式,Spring会为你做。

+0

想象不能访问ConsumerA/ConsumerB中的MySingleSingletonClass,只能通过MyServiceInterface访问服务。在这种情况下如何处理? - 谢谢 – LeTex

+1

@LeTex:那么'MySingleSingletonClass'必须实现'MyServiceInterface',两个消费者都会使用'@Autowired private MyServiceInterfaces mssc;'来代替。 – Ralph

0

你可以使用spring的工厂方法http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html来告诉spring使用getInstanceThroughService()来获取新的实例,而这些实例又会给出相同的缓存实例,从而维护你的单例。

但是,如果你使用弹簧,那么你不需要自己维护单身物件。 Spring会自动执行它(除非你的类正在Spring容器之外的同一个jvm/classloader中使用)。

0

Spring是一个实现名为inversion of control(或IoC)的设计模式的框架。 IoC的一个应用是允许外部框架配置和实例化应用程序的部分,实际上,这是Spring bean的功能。 Spring bean允许您使用配置文件配置应用程序资源并访问应用程序中的这些资源。

单身人士(和原型豆)由春天管理,所以你不需要自己实现Singleton设计模式。你只需要创建一个Spring兼容的bean并在Spring配置中声明它。然后您可以从应用程序上下文访问它。

您的bean仍然可以像通常那样实现一个接口,并且您可以在应用程序中使用该接口。