26

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

4 に答える 4

32

いいえ、デフォルト(引数なし)のコンストラクターを使用する必要はありません。

Beanをどのように定義しましたか?次のいずれかのようなBeanをインスタンス化するようにSpringに指示したようです。

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

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

コンストラクター引数を指定しなかった場合。前者はデフォルトの(または引数なしの)コンストラクターを使用します。constructor-arg引数を受け取るコンストラクターを使用する場合は、次のような要素で引数を指定する必要があります。

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

アプリケーションコンテキストで別のBeanを参照する場合は、属性ではなく要素のref属性を使用して参照できます。constructor-argval

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

<bean id="AnotherBean" class="some.other.Class" />
于 2011-09-20T22:47:21.290 に答える
19

ニコラスの答えは、XML 構成のお金に合っています。注釈を使用して Bean を構成する場合、コンストラクター注入を行う方が簡単であるだけでなく、はるかに自然な方法であることを指摘したいと思います。

class Foo {
    private SomeDependency someDependency;
    private OtherDependency otherDependency;

    @Autowired
    public Foo(SomeDependency someDependency, OtherDependency otherDependency) {
        this.someDependency = someDependency;
        this.otherDependency = otherDependency;
    }
}
于 2011-09-21T02:05:10.867 に答える
1

コンストラクターベースのインジェクション、つまりこのようなものを実行できる可能性があります (ここにあるドキュメントから取得)

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

しかし、うまくいくかどうかはわかりません。

JavaBean を定義している場合は、規則に従って、引数なしの public コンストラクターを配置する必要があります。

于 2011-09-20T22:45:09.260 に答える