Spring是否要求所有bean都有默认构造函数?

时间:2011-09-20 22:39:08

标签: java spring spring-mvc default-constructor

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

但是Spring似乎坚持要求:

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

这真的有必要吗?

4 个答案:

答案 0 :(得分:28)

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

你是如何定义你的bean的?听起来你可能已经告诉Spring将你的bean实例化为以下之一:

<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,可以使用ref元素的constructor-arg属性而不是val属性来执行此操作。

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

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

答案 1 :(得分:18)

nicholas对XML配置的回答是正确的。我只想指出,当使用注释来配置bean时,不仅可以更简单地进行构造函数注入,这是一种更自然的方式:

class Foo {
    private SomeDependency someDependency;
    private OtherDependency otherDependency;

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

答案 2 :(得分:1)

您可以进行基于构造函数的注入,即类似这样的内容(取自here找到的文档)

<bean id="foo" class="x.y.Foo">
    <constructor-arg ref="bar"/>
    <constructor-arg ref="baz"/>
</bean>

但我不确定它会奏效。

如果要定义JavaBean,则需要遵循约定并在其上放置一个公共的无参数构造函数。

答案 3 :(得分:0)

几乎所有的 Java 开发人员都知道编译器会在每个 Java 类中添加一个默认构造函数或更广为人知的无参数构造函数,但他们中的许多人忘记了它仅在您不提供任何其他构造函数时才这样做。这意味着如果开发人员添加显式构造函数,则添加无参数构造函数成为开发人员的责任。现在,为什么在 Java 中提供默认构造函数很重要,如果您的类没有无参数构造函数会发生什么?嗯,这就是许多 Java 面试中的问题,最常见的是作为 Spring 和 Hibernate 面试的一部分。

你应该总是在你的 Java 类中定义一个无参数构造函数,即使你正在编写一个显式构造函数,直到你完全确定它不会使用反射实例化并且实例化它没有参数构造函数是一个错误,就像在您的 Spring Bean 示例中一样。