Frage Singleton-Entwurfsmuster gegen Behälter Singleton-Bohnen im Frühjahr


Wie wir alle wissen, haben wir standardmäßig Beans als Singleton im Spring-Container und wenn wir eine Web-Anwendung basierend auf Spring-Framework haben, dann müssen wir Singleton-Entwurfsmuster implementieren, um globale Daten zu speichern, anstatt nur eine Bean durch Feder zu erstellen .

Bitte ertragen Sie mit mir, wenn ich nicht erklären kann, was ich eigentlich fragen wollte.


76
2018-04-14 13:47


Ursprung


Antworten:


Eine Singleton-Bohne im Frühjahr und das Singleton-Muster sind ziemlich unterschiedlich. Das Singleton-Muster besagt, dass immer nur eine Instanz einer bestimmten Klasse pro Klassenlader erstellt wird.

Der Umfang eines Spring Singletons wird als "pro Container pro Bean" beschrieben. Es ist der Bereich der Bean-Definition für eine einzelne Objektinstanz pro Spring-IoC-Container. Der Standardbereich in Spring ist Singleton.

Obwohl der Standardbereich Singleton ist, können Sie den Bereich von Bean ändern, indem Sie das Attribut scope von angeben <bean ../> Element.

<bean id=".." class=".." scope="prototype" />

49
2018-04-14 20:25



Singleton-Bereich im Frühling bedeutet Einzelinstanz in einem Spring-Kontext.
Der Spring-Container gibt die gleiche Instanz immer wieder für nachfolgende Aufrufe zurück, um die Bean zu erhalten.
 
 
Und Spring stört nicht, wenn die Klasse der Bean als Singleton codiert ist oder nicht, tatsächlich, wenn die Klasse als Singleton codiert ist, deren Konstruktor als private Spring verwendet, verwenden Sie BeanUtils.instantiateClass (javadoc Hier) Setzen Sie den Konstruktor auf barrierefrei und rufen Sie ihn auf.

Alternativ können wir ein Factory-Methode-Attribut in einer Bean-Definition wie diesem verwenden

    <bean id="exampleBean" class="example.Singleton"  factory-method="getInstance"/>

25
2018-06-20 15:27



Nehmen wir das einfachste Beispiel: Sie haben eine Anwendung und Sie verwenden nur den Standard-Classloader. Sie haben eine Klasse, die aus irgendeinem Grund entscheidet, dass nicht mehr als eine Instanz in der Anwendung enthalten sein soll. (Denken Sie an ein Szenario, in dem mehrere Personen an Teilen der Anwendung arbeiten).

Wenn Sie das Spring-Framework nicht verwenden, stellt das Singleton-Muster sicher, dass in Ihrer Anwendung nicht mehr als eine Instanz einer Klasse vorhanden ist. Das liegt daran, dass Sie Instanzen der Klasse nicht instanziieren können, indem Sie "neu" ausführen, da der Konstruktor privat ist. Die einzige Möglichkeit, eine Instanz der Klasse zu erhalten, besteht darin, eine statische Methode der Klasse aufzurufen (normalerweise 'getInstance' genannt), die immer dieselbe Instanz zurückgibt.

Zu sagen, dass Sie das Spring-Framework in Ihrer Anwendung verwenden, bedeutet nur, dass Sie zusätzlich zu den regulären Methoden zum Abrufen einer Instanz der Klasse (neue oder statische Methoden, die eine Instanz der Klasse zurückgeben) auch Spring bitten können Eine Instanz dieser Klasse und Spring stellt sicher, dass immer, wenn Sie nach einer Instanz dieser Klasse fragen, diese immer dieselbe Instanz zurückgibt, auch wenn Sie die Klasse nicht mit dem Singleton-Muster geschrieben haben. Mit anderen Worten, auch wenn die Klasse einen öffentlichen Konstruktor hat, wenn Spring immer nach einer Instanz dieser Klasse fragt, ruft Spring diesen Konstruktor nur einmal während der Laufzeit Ihrer Anwendung auf.

Wenn Sie Spring verwenden, sollten Sie Spring normalerweise nur zum Erstellen von Instanzen verwenden, und Sie können einen öffentlichen Konstruktor für die Klasse haben. Aber wenn Ihr Konstruktor nicht privat ist, verhindern Sie nicht wirklich, dass jemand direkt neue Instanzen der Klasse erzeugt, indem er Spring umgeht.

Wenn Sie wirklich eine einzelne Instanz der Klasse haben möchten, selbst wenn Sie Spring in Ihrer Anwendung verwenden und die Klasse in Spring als Singleton definieren, können Sie nur sicherstellen, dass auch die Klasse mit dem Singleton-Muster implementiert wird. Dies stellt sicher, dass es eine einzige Instanz gibt, ob Benutzer Spring verwenden, um eine Instanz abzurufen oder Spring zu umgehen.


18
2018-05-08 09:58



Der Singleton-Bereich in Spring bedeutet, dass diese Bean nur einmal von Spring instanziiert wird. Im Gegensatz zum Prototypbereich (jedes Mal neue Instanz), Anforderungsbereich (einmal pro Anforderung), Sitzungsumfang (einmal pro HTTP-Sitzung).

Der Singleton-Bereich hat technisch mit dem Singleton-Entwurfsmuster zu tun. Sie müssen Ihre Beans nicht als Singletons implementieren, damit sie in den Singleton-Bereich gesetzt werden können.


9
2018-04-14 17:00



Singleton-Bohnen im Frühling und Klassen, die auf Singleton-Designmustern basieren, sind ziemlich unterschiedlich.

Das Singleton-Muster stellt sicher, dass immer nur eine Instanz einer bestimmten Klasse pro Klassenlader erstellt wird, wobei der Bereich einer Spring-Singleton-Bean als "pro Container pro Bean" beschrieben wird. Der Singleton-Bereich in Spring bedeutet, dass diese Bean nur einmal von Spring instanziiert wird. Der Spring-Container gibt die gleiche Instanz immer wieder für nachfolgende Aufrufe zurück, um die Bean zu erhalten.


2
2017-11-27 18:29



Ich finde "per container per bean" schwer zu verstehen. Ich würde sagen "Eine Bohne pro Bohne id". Wir haben ein Beispiel, um es zu verstehen. Wir haben eine Bean-Klasse Sample. Ich habe in der Bean-Definition zwei Beans aus dieser Klasse definiert:

<bean id="id1" class="com.example.Sample" scope="singleton">
        <property name="name" value="James Bond 001"/>    
</bean>    
<bean id="id7" class="com.example.Sample" scope="singleton">
        <property name="name" value="James Bond 007"/>    
</bean>

Wenn ich also versuche, die Bean mit der ID "id1" zu erhalten, erstellt der Spring-Container eine Bean, speichert sie und gibt die gleiche Bean zurück, die jemals mit ID1 referenziert wurde. Wenn ich versuche, es mit ID7 zu bekommen, wird eine andere Bean aus der Sample-Klasse erzeugt, die jedes Mal zwischengespeichert und zurückgegeben wird, wenn Sie diese mit id7 referenzieren.

Dies ist unwahrscheinlich mit Singleton-Muster. Im Singlton-Muster wird immer ein Objekt pro Klassenlader erstellt. Aber im Frühling werden viele Objekte für die gleiche Klasse geschaffen. Im Frühling macht der Geltungsbereich jedoch Singleton, der dasselbe Objekt für dieselbe ID zurückgibt. Referenz


2
2018-01-01 20:11



"Singleton" im Frühjahr verwendet die Bean-Factory-Instanz, dann cache sie; welches Singleton-Entwurfsmuster strikt ist, kann die Instanz nur von der statischen Get-Methode abgerufen werden, und das Objekt kann niemals öffentlich instanziiert werden.


1
2017-10-01 06:20