bean定义中的constructor-arg和property

时间:2011-03-01 03:29:22

标签: java spring properties javabeans

<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 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分: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>

虽然bean中只有一个3-args构造函数。

使用构造函数的原因 - 它通过调用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源代码。似乎使用Spring 3.x,可以在XML bean 定义中结合 constructor-arg 属性(检查 AbstractAutowireCapableBeanFactory.java中的“doCreateBean”,下一步调用 createBeanInstance populateBean

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