2016-07-20 21 views
1

so habe ich diese Klasse Beispiel:Wie behalte ich den Wert einer statischen Klassenvariablen in Spring?

public class Test { 

    private static int idCounter; 
    private int id; 

    Test() { 
     id=++idCounter; 
    } 

    public void getId() { 
     System.out.printf("This id is %s",this.id); 
    } 
} 

Und die beans.xml config:

<beans> 
    <bean id="test" class="com.Test"/> 
</beans> 

Jetzt, wenn ich versuche, eine Arraylist zu machen, die statische Variable setzt jedes Mal.

for (int i=0;i<9;i++) { 
    arrayList.add(context.getBean("test"); 
    arrayList.get(i).getId(); 
} 

Es wird gedruckt, dass „Dies ist 1“ für jedes Objekt in der Arraylist. Wie kann ich es so machen, dass die statische Variable ihren globalen Wert behält?

+1

Da der Standardbereich Singleton ist, erhalten Sie jedes Mal dasselbe Bean/Objekt, also denselben Wert. versuche, den Umfang auf den Prototyp zu setzen – Sarief

+1

Ich frage mich: Warum benutzt du 'getBean (" Dreieck ")' anstelle von 'getBean (" Test ")'? – Andremoniy

Antwort

1

Standardmäßig haben Spring-Beans einen Singleton-Bereich, dh jede Anfrage gibt dieselbe Instanz von Bean zurück. Was Sie brauchen, ist ein Prototyp:

<bean id="myBean" class="com.test.MyClass" scope="prototype"/> 
2

Was hier passiert ist nicht, was Sie denken, passiert. Die statische Elementvariable wird nicht zurückgesetzt. es gibt nur eine Instanz Ihrer Test Bohne, und in der Schleife, die Sie sehen, ist die gleiche Test Bohne zehn Mal.

Spring-Beans haben standardmäßig einen Singleton-Bereich, was bedeutet, dass Spring nur eine Instanz der Bean erstellt, die jedes Mal verwendet wird, wenn sie injiziert oder nachgeschlagen wird. Wenn Sie eine neue Instanz jedes Mal erstellt werden sollen, geben Sie die Bohnen Prototyp Umfang anstelle des Standard-Singletons -umfang:

@Scope("prototype") 
public class Test { 
    // ... 
} 

Wenn Sie Ihren Spring-Beans unter Verwendung von XML konfigurieren, tun Sie es dann als Andrew Logvinov in seiner Antwort zeigt; fügen Sie ein scope Attribut:

<bean id="test" class="com.Test" scope="prototype"/> 

mehr zu erfahren, sehen Bean scopes im Spring Framework Referenzdokumentation.

+0

er verwendet xml, könnten Sie es auch in XML posten? – Sarief

0

Sie haben erklärt, Sie Bohne mit test ID:

<beans> 
    <bean id="test" class="com.Test"/> 
</beans> 

Aber nach, dass Sie Instanz einige andere Bohne erhalten id mit triangle:

context.getBean("triangle") 

Also, ich nehme an, das ist nur Typo -error: Sie erhalten eine Instanz einer anderen Bean, in der Sie keinen statischen ID-Zähler haben. Überprüfen Sie den Code und aktualisieren Sie die Frage, wenn ich nicht richtig bin.

0

Jesper's answer ist richtig; Da Sie dies als Singleton konfiguriert haben, gibt es nur eine Instanz der Klasse, der Konstruktor wird einmal aufgerufen.

Aber auch, wenn Sie beheben, dass dieser Prototyp Bereich verwenden es nicht funktionieren kann, wie Sie erwarten, aus zwei Gründen:

Sie so etwas wie AtomicInteger dafür verwenden sollte, wird es erlauben THREAD Erhöhen und Sichtbarkeit Garantien bieten.