конструктор-arg и свойство вместе в определении бина - PullRequest
8 голосов
/ 01 марта 2011
<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 по какой-то причине не устанавливается. Обратите внимание, что constructor-arg и property используются в одном и том же определении. Я не видел пример / сообщение с подобной функцией.

Ответы [ 2 ]

2 голосов
/ 05 июня 2014

По тем же источникам мой коллега обнаружил:

Caused by: org.springframework.beans.factory.BeanCreationException:
  Error creating bean with name 'service.MenuService#0'
  defined in class path resource [spring-beans/integrator.xml]:
  Could not resolve matching constructor (hint: specify index/type/name
  arguments for simple parameters to avoid type ambiguities)

пока мой хост, тестовый и производственный серверы не имеют такой ошибки.

С:

<bean class="service.MenuService">
    <constructor-arg index="0" type="java.lang.String" value="#{user}"/>
    <constructor-arg index="1" type="java.lang.String" value="#{password}"/>
    <constructor-arg index="2" type="java.lang.String" value="#{uri}"/>
    <property name="system" value="OPRT"/>
    <property name="client" value="OPRT"/>
</bean>

в то время как в bean-компоненте только один 3-аргументный конструктор.

Причина использования конструктора - он выполняет некоторые дополнительные действия с библиотекой, отличной от Spring, вызывая метод init(). И установите args как поля.

Так что я меняю spring-beans.xml на:

<bean class="service.MenuService" init-method="init">
    <property name="login" value="#{user}"/>
    <property name="password" value="#{password}"/>
    <property name="httpsUrl" value="#{uri}"/>
    <property name="system" value="OPRT" />
    <property name="client" value="OPRT" />
</bean>

Обратите внимание на init-method= часть.

ОБНОВЛЕНИЕ В конце концов я написал простой XML-конфиг и пошагово прошёл исходный код Spring в отладчике. Кажется, что в Spring 3.x возможно объединить constructor-arg и свойство в XML bean определение (проверка doCreateBean в AbstractAutowireCapableBeanFactory.java, который вызывает createBeanInstance и populateBean next).

Смотри также https://softwareengineering.stackexchange.com/questions/149378/both-constructor-and-setter-injection-together-in-spring/

2 голосов
/ 01 марта 2011

Смешивание <constructor-arg> и <property>, как правило, плохая идея.

Есть только одна веская причина для использования <constructor-arg>, а именно для создания неизменных объектов.

Однако ваши объекты не являются неизменяемыми, если вы можете установить их свойства.Не используйте <constructor-arg>.Перепроектируйте класс, используйте метод инициализатора, помеченный @PostConstruct, если вам нужно применить логику во время создания компонента.

...