2011-03-01 80 views
7
<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在相同的定义中使用。我还没有看到具有类似功能的示例/帖子。constructor-arg和bean定义中的属性

+2

哪个版本的Spring? Spring 3.0.5对我来说工作得很好。另外,尝试设置一个或另一个。我的猜测是你的问题与混合property和constructor-arg无关。 – Damien 2011-03-01 03:47:20

+1

这个语法很好。你确定你没有试图在构造函数的*里使用'cRef',因为它不会被这个点设置。 – skaffman 2011-03-01 09:56:28

+0

从一个bean的单个小写字母开始,可能会给Spring,Jackson和其他依赖于bean规范的人带来麻烦。如果您将该属性更改为myCRef,它是否解决了该问题? – Hazok 2016-02-22 21:35:33

回答

2

混合<constructor-arg><property>通常是一个坏主意。

使用<constructor-arg>只有一个很好的理由,那就是创建不可变的对象。

但是,如果您可以设置其属性,则您的对象不是不可变的。请勿使用<constructor-arg>。重新设计类,如果您需要在创建bean时应用一些逻辑,请使用注释为@PostConstruct的初始化方法。

+0

这很有道理。 通过使用autowire =“byName”和属性进行修复。不知何故,当struts实例化bean时,它并未使用自定义构造函数调用bean。这种修复更加可取。 – anthos 2011-03-02 04:46:42

2

在同一消息来源,我的同事发现:

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> 

同时也有只有一个豆3参数的构造。

使用构造函数的原因 - 它通过调用init()方法在非Spring库上执行一些其他操作。并将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=一部分。

UPDATE毕竟我写了简单的XML配置,并在调试器中通过Spring源代码。似乎与春天3.X有可能构造 - 精氨酸财产在XML 定义组合(检查doCreateBeanAbstractAutowireCapableBeanFactory.java,其中要求createBeanInstancepopulateBean下一个)。

另请参见https://softwareengineering.stackexchange.com/questions/149378/both-constructor-and-setter-injection-together-in-spring/