Spring-Einsteiger: 3 Fragen zum ApplicationContext (Beans und Dependencies Injection)

DarthShader

Erfahrenes Mitglied
Hallo,

ich bin gerade dabei, mich in die Dep. Injection von Spring / Spring Context einzuarbeiten und habe drei Fragen zu der XML Datei, die mir den Application Context konfiguriert:


1. Wenn ich einem Objekt A ein Objekt B injizieren will, schreibe ich das ja so:

Code:
<beans>
    <bean id="objectB" class="..."></bean>
    
    <bean id="objectA" class="...">
       <property name="objectB">
           <ref bean="objectB">
       </property>
    </bean>
</beans>

Hier bekommt das objectA eine Referenz auf objectB. Die Frage ist, kann ich das auch so angeben:

Code:
<beans>
    <bean id="objectA" class="...">
       <property name="objectB">
           <bean id="objectB" class="..."></bean>
       </property>
    </bean>
</beans>

Sodass ich hier gleich im XML Code so eine Verschachtelung habe und gleich sehe, welches Bean zu einem anderen gehört? Und könnte ich dann nicht die id vom "inneren Bean" weglassen?

2. Dann noch eine Frage, ich habe gelesen, dass Spring standardmäßig die Beans als Singletons behandelt. Kann ich dann folgendes machen:

Code:
<beans>
    <bean id="objectA100" class="de.foo.ObjectA">
        <property name="max" value="100" />
    </bean>

    <bean id="objectA200" class="de.foo.ObjectA">
        <property name="max" value="200" />
    </bean>
</beans>

Also 2 Beans, dieselbe Klasse, aber verschieden parametrisiert und Spring instanziiert automatisch 2 Objekte, einmal mit id "objectA100" und einmal mit id "objectA200"?


3. Und als letztes etwas sehr simples: Kann ich mir einen ApplicationContext aus einer XML Konfiguration bauen, die als String (der den XML Code enthält), und nicht als XML Datei, vorliegt (ich sehe in Beispielen immer nur die ClassPathResource Klasse, die die XML Konfiguration aus einer Datei, die im Classpath liegt, liest).


Vielen Dank für Eure Hilfe!
 

Das ist ja super, darf ich nur mal eben nachfragen, ob es einfach so, wie in meinem Beispiel geht, oder ob man noch irgendwelches Tags/Attribute angeben muss?
Ich frage deshalb, weil es ohne zusaätzliche Infos ja so wäre, dass Spring quasi auf dem "id"-Level die Singletons baut (Es gibt nur eine Instanz pro ID), und nicht auf dem Klassen-Level (es gibt nur eine Instanz pro Klasse).
Wenn dem wirklich so ist, hab ich nichts dagegen, so brauche ich es :)

3. es gibt auch FileSystemXmlAPplicationContext, mit dem du ein XML File von sonstwo laden. Desweiteren gibts zig verschiedene andere Möglichkeiten Spring zu konfigurieren:

http://www.parleys.com/display/PARLEYS/Ways+to+configure+the+Spring+container

Der Vortrag ist ja genial, vielen Dank. Den werde ich mir heute Abend, wenn ich etwas mehr Zeit habe, reinziehen.

Bis dahin, darf ich Dich nochmal kurz fragen, ob ich einen AppContext auch aus einem String, der XML enthält, erstellen kann? Ich bräuchte da nur eben ein Stichwort zu der entsprechenden Klasse :)


zu 1. wichtig dabei ist dann aber, dass die inner Bean nicht für andere sichtbar ist.

Das habe ich nicht verstanden - wen meinst Du mit "andere"? Andere Beans innerhalb der Konfig, oder irgendwie innerhalb der Applikation? Und warum ist das wichtig bzw. was könnten für Probleme entstehen?


Vielen Dank für Deine Hilfe!
 
Das ist ja super, darf ich nur mal eben nachfragen, ob es einfach so, wie in meinem Beispiel geht, oder ob man noch irgendwelches Tags/Attribute angeben muss?
Ich frage deshalb, weil es ohne zusaätzliche Infos ja so wäre, dass Spring quasi auf dem "id"-Level die Singletons baut (Es gibt nur eine Instanz pro ID), und nicht auf dem Klassen-Level (es gibt nur eine Instanz pro Klasse).
Wenn dem wirklich so ist, hab ich nichts dagegen, so brauche ich es :)
Korrekter ist "auf Bean Level". Nix weiter Notwendig. So wie du es jetzt hast definierst du einfach zwei Instanzen der Komponente.

Der Vortrag ist ja genial, vielen Dank. Den werde ich mir heute Abend, wenn ich etwas mehr Zeit habe, reinziehen.

Bis dahin, darf ich Dich nochmal kurz fragen, ob ich einen AppContext auch aus einem String, der XML enthält, erstellen kann? Ich bräuchte da nur eben ein Stichwort zu der entsprechenden Klasse :)
Auf die Schnelle hab ich nichts gefunden. Workaround: schreib das XML einfach irgendwo auf die Platte und lads wieder mit dem FileSystemXmlApplicatonContext.


Das habe ich nicht verstanden - wen meinst Du mit "andere"? Andere Beans innerhalb der Konfig, oder irgendwie innerhalb der Applikation? Und warum ist das wichtig bzw. was könnten für Probleme entstehen?

Vielen Dank für Deine Hilfe!
In der Konfig und in der Applikation. Dich hindert ja niemand dran, auch für die innere Bean eine id zu vergeben. Die ist dann aber quasi ohne Bedeutung. Andere Beans in deiner Applikation, können dann nicht mehr auf die Bean zugreifen. Auch nicht von BeanFactoryPostProcessoren aus. Solang die beinhaltende Bean dann keinen Getter für die inner Bean anbietet, ist das gute Stück dann komplett in der äußeren verborgen.

Gruß
Ollie
 

Neue Beiträge

Zurück