2016-12-19 13 views
1

春4としてプロトタイプというBeanスコープを自分のプログラムの1つで使用しようとしましたが、リクエストごとに異なるオブジェクトが作成されているかどうかを確認しています。そのために私は次のコードを使用していました:Spring 4はスコープ属性をサポートしていませんか?

<bean id="television" class = "org.java.springcore.Television" scope="prototype"> 
    <property name="model" value="Samsung_6970"/> 
    <property name="yearOfManufature" value="2016"/> 
    <property name="diameter" value="55"/>  
</bean> 

は、それから私は、次のように私のメインクラスの三角形のオブジェクト初期化:

public class TelevisionUser { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // BeanFactory factory = new XmlBeanFactory(new 
     // FileSystemResource("spring.xml")); 
     AbstractApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); 
     context.registerShutdownHook(); 

     Television television1 = (Television) context.getBean("television"); 

     television1.setMsg("Setting messege for Television"); 
     System.out.println("The message for television 1 is: "+television1.getMsg()); 
     Television television2 = (Television) context.getBean("television"); 

     System.out.println("The message for television 2 is: "+television2.getMsg()); 

    } 
} 

を、次のように私のテレビのクラスがある:

public class Television implements InitializingBean 
{ 
    private Integer yearOfManufature; 
    private String model; 
    private Integer diameter; 
    private String msg; 

    public String getModel() { 
     return model; 
    } 
    public void setModel(String model) { 
     this.model = model; 
    } 
    public Integer getYearOfManufature() { 
     return yearOfManufature; 
    } 
    public void setYearOfManufature(Integer yearOfManufature) { 
     this.yearOfManufature = yearOfManufature; 
    } 
    public Integer getDiameter() { 
     return diameter; 
    } 
    public void setDiameter(Integer diameter) { 
     this.diameter = diameter; 
    } 
    /** 
    * @return the msg 
    */ 
    public String getMsg() { 
     return msg; 
    } 
    /** 
    * @param msg the msg to set 
    */ 
    public void setMsg(String msg) { 
     this.msg = msg; 
    } 

    @Override 
    public void afterPropertiesSet() throws Exception { 
     System.out.println("Initialising the Bean Television"); 

    } 
} 

私は2つの質問があります:

  1. scope属性を使用しているとき、XMLバリデーターはエラーをスローしています。要素タイプ "bean"に対して "属性"スコープ "を宣言する必要があります。 ?私は属性シングルトンを使用し、それが偽の値です設定した場合、「 がスコープされたスプリング4のために使用されなく多くの属性

  2. 、その後、私のプログラムが妙に動作しない、すなわち出力がに来ている:初期化

    豆テレビ テレビ1のメッセージがある:テレビ テレビ2のメッセージの設定messegeである:テレビ

の設定messege Beanがあっても、出力から明らかなように、一度だけ初期化されています私はseですttingシングルトン= "false"。したがって、メッセージはテレビ1のためにセットアップされており、テレビ2にも反映されている。

どこが間違っているのか分かりません。

答えて

3

scope属性bean要素は、Spring 4でまだサポートされています。http://www.springframework.org/schema/beans/spring-beans-4.3.xsd beansスキーマを参照してください。

singletonしかし、あなたの例がおそらく失敗している理由です。 Spring 2.0以降はまだ内部的にサポートされていますが、後で完全に削除される可能性があります。バリデータは、あなたのBean定義に失敗した理由について

:あなたは適切なスキーマの場所を持っているかどうかを

  • がチェック: xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd"

  • 私はあなたの例では、いくつかの二重のスペースを参照してください、ただそこにあるかどうかを確認してくださいスペースやタブとUnicodeからの奇妙な文字。

+0

ありがとうZybnek。あなたはそれを正しく持っています。私は何らかの形でdoctype宣言でSpringバージョンについて言及していませんでした。 –

+0

<!DOCTYPE beans PUBLIC " - // SPRING // DTD BEAN 4.3 // EN" "http://www.springframework.org/dtd/spring-beans-4.3.dtd">を言及したのではなく、 <!DOCTYPE beans PUBLIC " - // SPRING // DTD BEAN // EN" "http://www.springframework.org/dtd/spring-beans.dtd">。したがって、問題です。私の結果は次のようになっています:Bean Televisionを初期化する テレビ1のメッセージは次のとおりです。テレビのメッセージを設定する Bean Televisionを初期化する テレビ2のメッセージはnullです。 –

関連する問題