2016-11-23 12 views
0

SpringでBeanのスコープをテストするためにいくつかのクラスを作成しました。 私の理解では、スコープがsingeltonの場合、Springは常にhelloWorldオブジェクトのインスタンスを1つだけ与えます。ナムトランからこんにちはSpringのSingletonスコープのBeanのインスタンス

をしかし実際には、出力は次のとおりです:あなたのメッセージ :ナムトラン アラートからTestBeanScopeからこんにちは:それは私がプログラムを実行すると、出力は

あなたのメッセージであることを意味

メッセージ:Hello from Nam Tran TestBeanScopeのアラート: メッセージ:Hello World!

理由を教えてください。

===

package namtran.tutorial; 

public class HelloWorld { 
     private String message; 

     public void setMessage(String message){ 
      this.message = message; 
     } 
     public void getMessage(){ 
      System.out.println("Your Message : " + message); 
     } 
    } 

==========

package namtran.tutorial; 

import org.springframework.context.support.AbstractApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class TestBeanScope { 
    public void getMessage(){ 
     @SuppressWarnings("resource") 
     AbstractApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); 
     HelloWorld obj = (HelloWorld) context.getBean("helloWorld"); 
     System.out.println("Alert from TestBeanScope:\n"); 
     obj.getMessage(); 
    } 
} 

=============

package namtran.tutorial; 

import org.springframework.context.support.AbstractApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class MainApp { 

    public static void main(String[] args) { 
     @SuppressWarnings("resource") 
     AbstractApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); 

     HelloWorld obj = (HelloWorld) context.getBean("helloWorld"); 
     obj.setMessage("Hello from Nam Tran"); 
     obj.getMessage(); 

     context.registerShutdownHook(); 
     TestBeanScope obj1 = new TestBeanScope(); 
     obj1.getMessage(); 

    } 
} 

==== Beans.xml ====

<?xml version="1.0" encoding="UTF-8"?> 

<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="helloWorld" 
     class="namtran.tutorial.HelloWorld" scope="singleton"> 
     <property name="message" value="Hello World!"/> 
    </bean> 
</beans> 

答えて

0

私が理解したように、複数の設定位置の場合、先にロードされたファイル

あなたが最初にあなたのメインメソッドでコンテキストを作成

とセットで定義されたものを上書きします、後でBean定義で ClassPathXmlApplicationContext doc

に従ってくださいmessage、それが印刷されます
Your Message : Hello from Nam Tran
helloWorld beanがオーバーライドされるようにTestBeanScopeに新しいコンテキストを作成しました。そのメッセージはとなり、Beans.xmlで宣言されています。したがって、メッセージは
Alert from TestBeanScope: Hello World!

+0

となります。出力が「あなたのメッセージ:ナム・トランからのこんにちは」である場合、どうすればいいですか。これは、コンテキストオブジェクトをTestBeanScopeクラスに渡す必要があることを意味します。この方法はBeanのインスタンスを保持するための私の期待ではありません。 –

+0

注釈@Autowiredを使用してApplicationContextを挿入するか、インタフェース[ApplicationContextAware](http:// docs。 spring.io/spring/docs/current/javadoc-api/org/springframework/context/ApplicationContextAware.html) –

+0

私はどこでもbeanが得られるという機能を見つけたいと思っています。 InjectContextは私の方法ではありません。 Webアプリケーションを使用してBeanのセッションスコープを想像してください。それは私が本当に望む方法です。 –

関連する問題