2

私はSpringが初めてで、小さな要件があります。

<bean name="triangle" class="com.thomson.learn.spring.triangle">
    <property name="name" ref="dataSource" />
</bean>

<bean id="dataSource" class="java.lang.String">
    <property name="name" value="easy" />
</bean>

上記のように Bean を書きました。easyを使用して Bean から値にアクセスする必要がありますid="triangle"が、これを実行しようとすると例外が発生します。誰かがこの問題を克服する方法を提案できますか?

4

3 に答える 3

0

次のことを試してください。

<bean name="triangle" class="com.thomson.learn.spring.triangle">
        <property name="name" ref="dataSource" />
</bean>

<bean id="dataSource" class="com.thomson.learn.spring.shape">
    <property name="name" value="easy" />
</bean>

プロジェクト内のクラスとして存在する必要がありますcom.thomson.learn.spring.triangle。アクセスするプロパティ(メソッドgetter)がないためcom.thomson.learn.spring.shapeStringクラスBeanは機能しませんでした。StringnamegetName()

于 2012-04-25T13:41:16.697 に答える
0

すべての Bean に注入する文字列になる場合は、プロパティ ファイルからプロパティを参照して使用する<context:property-placeholder location="location to .properties"/> か、構成 xml でプロパティを定義することができます。<util:properties />

プロパティプレースホルダーの例

<bean id="appDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/> // Refered from property file
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>

    <context:property-placeholder location="classpath:jdbc.properties"/>
于 2012-04-25T17:22:02.240 に答える
0

文字列にはプロパティ「名前」がないため、意図した方法でインスタンス化することはできません。さらに、値として直接使用できるため、必要はありません。

<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 shapehere...

<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 を実装しています。

于 2012-04-25T12:31:00.113 に答える