arg和属性一起在bean中定义

<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><property>通常是一个坏主意。

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

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


在同一资料中,我的同事发现:

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= part。

更新毕竟我编写了简单的XML配置,并在调试器中逐步完成了Spring源代码。 似乎在Spring 3.x中,可以在XML bean定义中组合constructor-argproperty (检查AbstractAutowireCapableBeanFactory.java doCreateBean ,它调用createBeanInstancepopulateBean next)。

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

链接地址: http://www.djcxy.com/p/51197.html

上一篇: arg and property together in bean definition

下一篇: file renaming problem?