web-dev-qa-db-ja.com

Springでは、すべてのBeanにデフォルトのコンストラクターが必要ですか?

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

これは本当に必要ですか?

25
Koo Park

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

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-arg要素のval属性を使用して参照できます。

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

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

nicholasの答えは、XML構成の費用に見合っています。注釈を使用してBeanを構成する場合、コンストラクターインジェクションを行う方が簡単であるだけでなく、それを実行するはるかに自然な方法であることを指摘したいと思います。

class Foo {
    private SomeDependency someDependency;
    private OtherDependency otherDependency;

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

あなたはコンストラクタベースのインジェクション、つまりこのようなことを行うことができるかもしれません(見つかったドキュメントから取得 ここ

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

しかし、それが機能するかどうかはわかりません。

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

1
hvgotcodes