文字列にはプロパティ「名前」がないため、意図した方法でインスタンス化することはできません。さらに、値として直接使用できるため、必要はありません。
<bean name="triangle" class="com.thomson.learn.spring.triangle">
<property name="name" value="easy" />
</bean>
あなたのコメントに返信して編集してください: If "name" is of type shape
, then you need to inject a shape
here...
<bean name="triangle" class="com.thomson.learn.spring.triangle">
<property name="name" ref="shape" />
</bean>
<bean name="shape" class="com.thomson.learn.spring.shape">
<!-- configure properties here -->
</bean>
Spring によって配線されたオブジェクトは、JavaBeans であると想定されています。これが実際に意味することは、引数のないコンストラクターと一連のプロパティがあり、それぞれがゲッターとセッターの両方を持っているということです。上記のような定義を記述すると、Spring はセッターを使用して、構成ファイルで定義したプロパティを設定します。
たとえば、Shape
次のようなクラスだった場合:
package com.thomson.learn.spring.Shape;
class Shape {
private String name;
public Shape() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
次に、次のように配線できます。
<bean id="myShape" class="com.thomson.learn.spring.Shape">
<property name="name" value="blah" />
</bean>
これは実際には、実行時に以下を実行する Spring に変換されます。
Shape myShape = new Shape();
shape.setName("blah");
プロパティはもちろん、他のクラスのより複雑なインスタンスになる可能性があることを除いて、これですべてです。これがref
、プロパティの別の Bean を参照するために使用できる理由です。
PS: 多くの場合、Spring はリフレクションを使用して値を注入できるため、実際にはセッターは必要ありませんが、ほとんどの人はさまざまな理由でこの方法で Bean を実装しています。