Java 构造函数arg和属性一起出现在bean定义中

Java 构造函数arg和属性一起出现在bean定义中,java,spring,properties,javabeans,Java,Spring,Properties,Javabeans,由于某些原因,未设置aObject.cRef。请注意,构造函数arg和属性在同一定义中使用。我还没有看到类似的例子/帖子。混合和通常是个坏主意 使用只有一个很好的理由,那就是创建不可变的对象 但是,如果可以设置对象的属性,则对象不是不可变的。不要使用。重新设计类,如果需要在bean创建时应用一些逻辑,请使用带有@PostConstruct注释的初始值设定项方法。在我同事发现的相同来源上: <bean id="cObject" scope="request" class="x.y.z.CCl

由于某些原因,未设置aObject.cRef。请注意,构造函数arg和属性在同一定义中使用。我还没有看到类似的例子/帖子。

混合
通常是个坏主意

使用
只有一个很好的理由,那就是创建不可变的对象


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

在我同事发现的相同来源上:

<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>
而我的主机、测试服务器和生产服务器没有这样的错误

与:

注意
init方法=
part

更新毕竟我在调试器中编写了简单的XML配置和Spring源代码。似乎在Spring3.x中,可以在XMLbean定义中组合构造函数arg属性(在
AbstractAutowireCapableBeanFactory.java
中选中doCreateBean,后者调用createBeanInstancepopulateBean下一步)


另请参见哪个版本的Spring?Spring3.0.5对我来说很好。另外,尝试只设置其中一个。我猜您的问题与混合属性和构造函数arg无关。这种语法很好。你确定你没有试图在构造函数中使用
cRef
,因为它不会在该点设置。从bean的单个小写字母开始可能会给Spring、Jackson和其他依赖bean规范的人带来麻烦。如果您将属性更改为myCRef,它是否解决了此问题?这样做是有意义的。通过使用autowire=“byName”和属性进行修复。不知何故,当struts实例化bean时,它没有使用自定义构造函数调用bean。这种修复方法更可取。
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 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>