2016-07-12 8 views
0

zu implementieren Ich möchte Singleton-Muster im Zusammenhang mit Spring-Anwendung implementieren. So wird sogar mein Singleton-Objekt vom Frühling erstellt.Eine gute Möglichkeit Singleton-Muster mit Spring

, das zu tun:

ich eine Klasse setzen, die ApplicationContextAware bekommen Bohnen aus Feder Kontext implementiert:

public class AppContext implements ApplicationContextAware 
{ 

    /** 
    * Private instance of the AppContext. 
    */ 
    private static AppContext _instance; 

    /** 
    * @return the instance of AppContext 
    */ 
    public static AppContext getInstance() 
    { 

    return AppContext._instance; 
    } 

    /** 
    * Instance of the ApplicationContext. 
    */ 
    private ApplicationContext _applicationContext; 

    /** 
    * Constructor (should never be call from the code). 
    */ 
    public AppContext() 
    { 
    if (AppContext._instance != null) 
    { 
     throw (new java.lang.RuntimeException(Messages.getString("AppContext.singleton_already_exists_msg"))); //$NON-NLS-1$ 
    } 
    AppContext._instance = this; 
    } 

    /** 
    * Get an instance of a class define in the ApplicationContext. 
    * 
    * @param name_p 
    *   the Bean's identifier in the ApplicationContext 
    * @param <T> 
    *   the type of the returned bean 
    * @return An instance of the class 
    */ 
    @SuppressWarnings("unchecked") 
    public <T> T getBean(String name_p) 
    { 

    return (T) _applicationContext.getBean(name_p); 
    } 

    @Override 
    public void setApplicationContext(ApplicationContext applicationContext_p) throws BeansException 
    { 
    _applicationContext = applicationContext_p; 
    } 
} 

Meine Singletonklasse:

public class MySingleton { 

    private static MySingleton instance= null; 
    public static final String BEAN_ID = "mySingletonInstanceId"; 

    private MySingleton(){} 


    public static MySingleton getInstance(){ 
     return AppContext.getInstance().getBean(mySingletonInstanceId.BEAN_ID); 
    } 
    } 

Mein application.xml Datei:

<beans xmlns="http://www.springframework.org/schema/beans" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" 
      xmlns:cxf="http://cxf.apache.org/core" xmlns:jaxrs="http://cxf.apache.org/jaxrs" 
      xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd 
    http://cxf.apache.org/jaxrs 
    http://cxf.apache.org/schemas/jaxrs.xsd 
    http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd"> 

    <!--some code--> 

     <bean id="idAppContext" class="com.AppContext" /> 
     <bean id="mySingletonInstanceId" class="com.MySingleton"/> 

    <!--some code--> 

    </beans> 

Glaubst du, dass mein Code gut ist?

Instanz Feld ist nicht mehr erforderlich?

In Anbetracht, dass der Frühling wird alles zu verwalten, getInstance() muss Singleton Instanz nur von Frühling erstellt zurückgeben?

+3

Schreiben Sie keinen Code, der dies tut. Verwenden Sie die Abhängigkeitsinjektion anstelle dieses hässlichen Geräts. –

+5

Standardmäßig sind Frühlingsbohnen Singletons. Versuchen Sie nur, Abhängigkeitsinjektion zu verwenden, und Frühling tut es für Sie. –

+0

Wenn ich gut verstehe, ist es nicht mehr notwendig Singleton-Muster in Spring-Anwendung zu verwenden? –

Antwort

1

Ich kam zu der gleichen Schlussfolgerung und eine ähnliche Implementierung wie Sie. Wenn jemand ein Singleton-Muster benötigt, dann ist dies die Art, es mit Spring zu machen. Ich wünschte, ich hätte diesen Beitrag schon früher gesehen.

verstehen Manche Menschen wissen nicht, dass die Singleton Pattern als die Singleton von Spring definiert unterscheiden, die hier erklärt: Singleton design pattern vs Singleton beans in Spring container

es schwierig ist um die Reflexion zu erhalten, die durch Feder verwendet wird, die die privaten ignoriert effektiv Zugriffsmodifizierer

Nachdem dies gesagt ist, einige Leute das Singleton Pattern hassen, wie sie durch diesen Beitrag zu sehen: http://puredanger.github.io/tech.puredanger.com/2007/07/03/pattern-hate-singleton/ Das bin ich mit dem Design Singleton-Muster mit zu überdenken verursacht

und stattdessen den Frühling Singleton stattdessen verwenden.

Verwandte Themen