constructor-arg und Eigenschaft zusammen in der bean-definition
<bean id="cObject" scope="request" class="x.y.z.CClass"/>
<bean id="bObject" scope="request" class="x.y.z.BClass"/>
<bean id="aObject" scope="request" class="x.y.z.AClass">
<constructor-arg ref="bObject" />
<property name="cRef" ref="cObject" />
</bean>
aObject.cRef ist, nicht zu bekommen, setzen aus irgendeinem Grund. Beachten Sie, dass die constructor-arg und Eigentum sind in der gleichen definition. Ich habe nicht gesehen, ein Beispiel /post mit einer ähnlichen Funktion.
- Welche version von Spring? Funktioniert gut für mich mit Spring 3.0.5. Auch, versuchen Sie, nur eine oder die andere. Meine Vermutung ist, dass dein problem nichts zu tun hat mit der Mischung von Eigentum und constructor-arg.
- Diese syntax ist in Ordnung. Sind Sie sicher, dass Sie nicht versuchen, zu verwenden
cRef
innerhalb der Konstruktor, weil Sie nicht eingestellt wurden, durch diesen Punkt. - Beginnend mit einem Kleinbuchstaben für eine bean kann dazu führen, Störungen mit Feder, Jackson, und andere, die verlassen sich auf die bean-Spezifikation. Wenn Sie änderungen an der Eigenschaft zu myCRef es tut Umgehung des Problems?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mischen
<constructor-arg>
und<property>
ist in der Regel eine schlechte Idee.Gibt es nur einen guten Grund für die Verwendung
<constructor-arg>
, und das ist zu schaffen unveränderliche Objekte.Jedoch, Ihre Objekte sind nicht immutable, wenn Sie Ihre Eigenschaften festlegen. Verwenden Sie nicht
<constructor-arg>
. Redesign der Klasse, verwenden Sie eine Initialisierungsmethode kommentiert mit@PostConstruct
wenn Sie brauchen, um zu übernehmen einige Logik bean Zeitpunkt der Erstellung.Auf denselben Quellen, die meine Kollegen entdecken:
während mein host -, test-und Produktions-Servern haben keine derartigen Fehler.
Mit:
zwar gibt es nur eine 3-args-Konstruktor in Bohnen.
Den Grund für die Verwendung von Konstruktor - es führen einige zusätzliche Aktionen auf non-Spring-Bibliothek durch Aufruf
init()
Methode. Und set args als Felder.So, ich ändern
spring-beans.xml
zu:Beachten
init-method=
Teil.UPDATE Nach allem, was ich schrieb einfache XML-config und Schritt durch die Spring source code im debugger. Scheint, dass mit Spring 3.x es ist möglich, kombinieren constructor-arg und Eigenschaft in XML bean definition (check doCreateBean in
AbstractAutowireCapableBeanFactory.java
, die nennen createBeanInstance und populateBean weiter).Siehe auch https://softwareengineering.stackexchange.com/questions/149378/both-constructor-and-setter-injection-together-in-spring/