Spring是否要求所有豆子都有一个默认的构造函数?

我不想为我的类创建默认构造函数。auditRecord

但斯普林似乎坚持这一点:

org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'auditRecord' defined in ServletContext resource
[/WEB-INF/applicationContext.xml]: 
Instantiation of bean failed; 
nested exception is org.springframework.beans.BeanInstantiationException: 
Could not instantiate bean class [com.bartholem.AuditRecord]: 
No default constructor found; 
nested exception is 
java.security.PrivilegedActionException:
java.lang.NoSuchMethodException: 
com.bartholem.AuditRecord

这真的有必要吗?


答案 1

否,不需要使用默认(无 arg)构造函数。

你是如何定义你的豆子的?听起来你可能已经告诉Spring来实例化你的豆子,就像下面一个:

<bean id="AuditRecord" class="com.bartholem.AuditRecord"/>

<bean id="AnotherAuditRecord" class="com.bartholem.AuditRecord">
  <property name="someProperty" val="someVal"/>
</bean>

未提供构造函数参数的位置。前面的将使用默认(或无 arg)构造函数。如果要使用接受参数的构造函数,则需要使用如下元素指定它们:constructor-arg

<bean id="AnotherAuditRecord" class="com.bartholem.AuditRecord">
  <constructor-arg val="someVal"/>
</bean>

如果要在应用程序上下文中引用另一个 Bean,则可以使用元素的属性而不是属性来执行此操作。refconstructor-argval

<bean id="AnotherAuditRecord" class="com.bartholem.AuditRecord">
  <constructor-arg ref="AnotherBean"/>
</bean>

<bean id="AnotherBean" class="some.other.Class" />

答案 2

nicholas的答案是正确的,关于XML配置的钱。我只想指出,当使用注释来配置你的bean时,不仅构造函数注入更简单,而且这是一种更自然的方式:

class Foo {
    private SomeDependency someDependency;
    private OtherDependency otherDependency;

    @Autowired
    public Foo(SomeDependency someDependency, OtherDependency otherDependency) {
        this.someDependency = someDependency;
        this.otherDependency = otherDependency;
    }
}

推荐