2010-11-23 13 views
4

Spring 3.0.2では、Bean Aのプロパティを別のBean Bに注入しようとしていますが、Spring ELが動作していません。Spring 3.0では、あるBeanのプロパティを別のBeanに挿入するにはどうすればよいですか?

Bean AはJavaで手動で作成されています。 Bean BはXMLを使用して作成されます。この場合ビーンAにおいて

はポテトビーンBベビー(両方パッケージspringinitで)です。

ビーンA(ポテト):

public class Potato { 
    String potatoType; 

    public String getPotatoType() { return potatoType; } 

    public void setPotatoType(String potatoType) { this.potatoType = potatoType; } 

    @Override 
    public String toString() { 
     return "Potato{" + "potatoType=" + potatoType + '}'; 
    } 
} 

ビーンB(ベビー):私のメインクラスで

public class Baby { 

    private String name; 
    private Potato potatoThing; 

    public String getName() { return name; } 

    public void setName(String name) { this.name = name; } 

    public Potato getPotatoThing() { return potatoThing; } 

    public void setPotatoThing(Potato p) { this.potatoThing = p; } 

    @Override 
    public String toString() { 
     return "Baby{" + "name=" + name + 
       ", potatoThing=" + potatoThing + '}'; 
    } 
} 

、私はポテトを作成し、作成しようとすると、XMLでそれを使用しますベビー

package springinit; 

import static org.springframework.beans.factory.support.BeanDefinitionBuilder.genericBeanDefinition; 
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; 
import org.springframework.context.support.GenericApplicationContext; 
import org.springframework.core.io.ClassPathResource; 

public class Main { 

    public static void main(String[] args) { 
     GenericApplicationContext ctx= new GenericApplicationContext(); 

     // define java-based spring bean 
     ctx.registerBeanDefinition("myPotato", 
       genericBeanDefinition(Potato.class) 
        .addPropertyValue("potatoType", "spudzz") 
        .getBeanDefinition()); 

     // read in XML-bean 
     XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(ctx); 
     xmlReader.loadBeanDefinitions(
       new ClassPathResource("/resources/spring_init.xml")); 

     // print out results 
     System.out.format(
       "Baby: %s%n%n" + 
       "Potato: %s%n", 
       ctx.getBean(Baby.class), 
       ctx.getBean(Potato.class) 
     ); 
    } 
} 

は、ここに私のspring_init.xmlです:

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 

    <bean id="myBaby" class="springinit.Baby" depends-on="myPotato"> 
     <property name="name" value="#{myPotato.potatoType}" /> 
     <property name="potatoThing"> 
      <ref bean="myPotato" /> 
      </property> 
    </bean> 
</beans> 

私がメイン実行すると、私はこの出力を得る:

Baby: Baby{name=#{myPotato.potatoType}, potatoThing=Potato{potatoType=spudzz}} 

Potato: Potato{potatoType=spudzz} 

私は赤ちゃんの名前はmyPotatoの財産である「spudzz」、になりたいです。なぜ春はこの値を赤ちゃんに注入しないのですか?

ありがとうございます。十分にはっきりしていればいいと思う。

答えて

5

おそらく、豆を得る前にctx.refresh()に電話する必要があります。

javadocから:典型的な使用法はBeanDefinitionRegistryインタフェースを介してBean定義の多様を登録した後ApplicationContextAware、自動検出を扱う(アプリケーション・コンテキストの意味を有するもの豆を初期化するためにAbstractApplicationContext.refresh()を呼び出すことである

BeanFactoryPostProcessorsなど)を使用します。

+0

これはうまくいきました。お手伝いありがとう! 実際には、JMXサーバーのポート番号をコマンドラインパラメータに基づいて注入したいので、JMXファイルをロードする前にctx.refresh()を呼び出します。 –

+0

@black:更新されました。 – axtavt

関連する問題