Java Reference
In-Depth Information
Counter counter = context.getBean("counter", Counter.class);
for(int i = 0; i < 10; i++)
{
counter.increment();
}
System.out.println("counter = " + counter.get());
counter = context.getBean("counter", Counter.class);
System.out.println("counter = " + counter.get());
}
}
Zunächst wird unter Angabe der XML-Konfi gurationsdatei ein ApplicationContext erzeugt.
Vom ApplicationContext kann man sich unter Angabe ihres Namens eine Referenz auf die
Zählerkomponente aus der Konfi gurationsdatei geben lassen. Die Methode getBean ist eine
generische Methode. Durch Vorgabe der Klasse Counter als zweites Argument in der
Methode getBean kann man sich das Casting ersparen. Man kann aber auch weiterhin die
alte Variante verwenden, bei der man casten muss:
Counter counter = (Counter) context.getBean("counter");
Der Zähler wird danach zehn Mal erhöht. Dann wird sein Wert ausgegeben. Nicht überra-
schend ist dieser 10. Anschließend wird die Zählerkomponente über getBean erneut vom
ApplicationContext bescha . Über diese neue Referenz wird dann wieder der aktuelle Wert
des Zählers ausgegeben. An der erneuten Ausgabe des Werts 10 erkennt man, dass der
ApplicationContext bei Angabe des Namens „counter“ jedes Mal dasselbe Objekt zurück-
gibt. Dies liegt an der Einstellung in der Konfi gurationsdatei. Ohne Angabe von scope ist die
oben gezeigte Konfi gurationsinformation äquivalent mit dieser hier:
<bean id="counter" class="javacomp.spring.counter.Counter"
scope="singleton">
</bean>
Im Normalfall sind Spring-Komponenten also Singletons. Das heißt, dass der Application-
Context nur ein einziges Objekt erzeugt. Anders sieht es bei diesem Inhalt in der Konfi gu-
rationsdatei aus:
<bean id="counter" class="javacomp.spring.counter.Counter"
scope="prototype">
</bean>
Jetzt wird bei jedem Aufruf von getBean ein neues Objekt erzeugt. Das Programm aus
Listing 14.2 gibt in diesem Fall die Werte 10 und 0 aus.
Wenn man für die Klasse Counter einen Konstruktor anlegt, in dem etwas ausgegeben wird,
dann kann man sehen, dass im Singleton-Fall das einzige Counter-Objekt bereits beim
Erzeugen des ApplicationContext angelegt wird, während im Fall Prototype bei jedem Auf-
ruf von getBean ein Objekt entsteht. Für Singletons kann man allerdings auch die Konfi gu-
ration auf „lazy-init“ setzen. In diesem Fall wird dieses eine Objekt nur dann erzeugt, wenn
es benötigt wird, und nicht schon standardmäßig beim Verarbeiten der Konfi gurationsdatei.
Ein Spring-Objekt wird nicht nur dann benötigt, wenn es durch getBean in einer Anwen-
dung angefordert wird (wie in Listing 14.2), sondern auch dann, wenn eine andere Kom-
ponente, die erzeugt wird, eine Referenz auf die erste Komponente besitzt (s. folgender
Abschnitt).
 
Search WWH ::




Custom Search