2016-11-23 5 views
0

Ich habe einige Klassen erstellt, um den Geltungsbereich von Bean im Frühling wie unten zu testen In meinem Verständnis, wenn der Bereich singelton ist, gibt Spring immer nur eine Instanz für helloWorld-Objekt. Das bedeutet, wenn ich das Programm laufen dann die AusgabeInstanz von Bean im Singleton-Bereich im Frühjahr

Ihre Nachricht sein: Hallo von Nam Tran Benachrichtigung von TestBeanScope: Ihre Nachricht: Hallo von Nam Tran

Aber eigentlich ist der Ausgang:

Ihre Nachricht: Hallo aus Nam Tran Warnung von TestBeanScope: Ihre Nachricht: Hallo Welt!

Könnten Sie bitte erklären warum?

===

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(); 

    } 
} 

==== Bohnen.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> 

Antwort

0

Wie ich verstehe, folgen Sie dem ClassPathXmlApplicationContext doc

Bei mehreren Konfigurations Orten später Bean Definitionen werden diejenigen, die in früheren geladenen Dateien

Wenn Sie einen Kontext erstellen Sie zunächst in Ihrem Haupt-Methode und setzen definiert außer Kraft setzen Die message, wird es Your Message : Hello from Nam Tran
Dann haben Sie einen neuen Kontext in TestBeanScope erstellt, so dass helloWorld Bohne overiden wird. Seine Nachricht wird Hello World! sein, wie es in Beans.xml erklärt wurde. Daher lautet die Nachricht
Alert from TestBeanScope: Hello World!

+0

Wie kann ich tun, wenn ich möchte, ist die Ausgabe "Ihre Nachricht: Hallo von Nam Tran". Das bedeutet, dass ich das Kontextobjekt an die TestBeanScope-Klasse übergeben muss. Auf diese Weise erwarte ich keine Instanz der Bean. –

+0

Sie können ApplicationContext mit der Annotation '@ Autowired' injizieren oder die Schnittstelle [ApplicationContextAware] (http: // docs. spring.io/spring/docs/current/javadoc-api/org/springframework/context/ApplicationContextAware.html) –

+0

Ich meine, ich möchte eine Funktion finden, die Bean überall bekommen kann. Inject ApplicationContext ist nicht mein Weg. Sie stellen sich den Sitzungsumfang für die Bean mit der Webanwendung vor. Es ist wirklich so, wie ich es möchte. –

Verwandte Themen