2016-08-03 24 views
2

Wenn ich versuche @ Scope ("Prototyp") über eine Klasse zu verwenden, sehe ich, dass es sich ähnlich wie "Singleton" verhält. Ich bin mir nicht sicher, wo ich falsch liege. Jede Hilfe wird sehr geschätzt.@Scope - Spring - Einstellung "Prototyp" mit Anmerkungen, verhält sich wie Singleton. Wo gehe ich falsch?

Employee-Klasse - Einstellung scope - Prototyp

import org.springframework.context.annotation.Scope; 
@Scope("prototype") 
public class Employee { 

    private String emp_name; 
    public String getEmp_name() { 
     return emp_name; 
    } 

    public void setEmp_name(String emp_name) { 
     this.emp_name = emp_name; 
    } 
} 

Abteilung Rahmen klassen Einstellung - Singleton

import org.springframework.context.annotation.Scope; 
@Scope("singleton") 
public class Department { 
private String dep_name; 

public String getDep_name() { 
    return dep_name; 
} 
public void setDep_name(String dep_name) { 
    this.dep_name = dep_name; 
} 

}

beans.xml

<context:component-scan base-package="com"/> 

<!-- Scope Annotations --> 
    <bean id="dep_scope" class="com.scope.annotation.Department" > 
    </bean> 
    <bean id="emp_scope" class="com.scope.annotation.Employee" > 
    </bean> 

Haupt App

public class MainApp { 
     public static void main(String[] args) { 
      ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); 

      Employee emp = (Employee) context.getBean("emp_scope"); 
      emp.setEmp_name("Saro"); 
      System.out.println("first"+emp.getEmp_name()); 

      Employee emp2 = (Employee) context.getBean("emp_scope"); 
      System.out.println("second"+emp2.getEmp_name()); 

      Department dep = (Department) context.getBean("dep_scope"); 
      dep.setDep_name("Maths"); 
      System.out.println("first"+dep.getDep_name()); 

      Department dep2 = (Department) context.getBean("dep_scope"); 
      System.out.println("second"+dep2.getDep_name()); 
     } 
    } 

Ausgang:

firstSaro secondSaro firstMaths secondMaths

I expected secondnull instead of secondSaro 
+0

Wo haben Sie die Annotation-Scan-Direktive? – Jens

+1

nur versuchen, Umfang in beans.xml Datei in Bean-Tag zu definieren .... Sie beide Annotation und XML verwenden ... nur entweder verwenden .... es –

+0

@Jens kann helfen, habe ich den in meiner beans.xml, verpasse das gleiche hier, bearbeite meinen Beitrag jetzt. Bitte helfen Sie mit. – Sarronya

Antwort

1

Versuche mal Umfang in beans.xml Datei in Bean-Tag zu definieren .... Sie verwenden sowohl Annotation und xml ... benutze einfach beides ..

Oder du kannst versuchen, bean us zu definieren Annotation ... für diese können Sie @Bean Annotation verwenden.

@Configuration 
public class Config { 

    @Bean(scope=DefaultScopes.PROTOTYPE) 
    public TestBean testBean(){ 
     return new TestBean(); 
    } 
} 

und in Ihrer Haupt-Logik können Sie unten Code

TestBean testBean = ctx.getBean(TestBean.class); 
+0

Könnten Sie mir bitte sagen, wie Sie den Geltungsbereich hier mit Anmerkungen auf der Bean anwenden, sagen wir testBean. Wie lese ich das gleiche aus meiner Hauptlogik? – Sarronya

+0

Ich habe meine Antwort nach Ihren Anforderungen bearbeitet –

+0

Ich bin nicht in der Lage, das gleiche zu tun, finden Sie bitte den Kompilierungsfehler. Mehrere Marker an dieser Linie \t - Das Attribut Umfang ist für die Anmerkung undefined \t Typ Bean \t - DefaultScopes nicht auf eine Variable – Sarronya

1

Es verhält sich wie ein Singleton verwenden, da dies die Art und Weise ist es in der XML-conf definiert ist. Standardbereich ist Singleton, Prototyp soll erklärt werden wie folgt

<bean id="dep_scope" class="com.scope.annotation.Department" scope="prototype"> 
</bean> 

Wenn Sie Anmerkungen verwenden, heißt es javadoc dass @Scope sollte mit @Component, wie diese

@Component 
@Scope("prototype") 
public class Employee { 
    //... 
} 

public class ExampleUsingEmployee {  
    @Inject 
    private Employee enployee; //will be automatically injected by spring  
    // ... do other stuff 
} 

Sie sollten es vermeiden, in Verbindung verwendet werden (Wenn möglich, verwenden Sie sowohl XML als auch Anmerkungen.

+0

@ noscreenname aufgelöst werden - ich das gleiche versucht, es half mir nt . Es tut uns leid ! – Sarronya

+0

versuchen, Ihr XML-Konfigurations Entfernen – noscreenname

+0

Wenn ich meine Bohne configs aus xml entfernen, bin ich nicht sicher, wie man diese Bohnen zugreifen zu können, von meiner Haupt-Logik. Name der Bohnen? – Sarronya

0

Sie haben

setzen
context:component-scan base-package="com" 

die Bohnen instanziiert werden versuchen, wenn sie mit @Component oder den anderen Bohnen Anmerkungen wie @Service kommentiert werden usw. Aber dies nicht Feder Prozess der anderen Anmerkungen Konfiguration vornehmen.

wenn Sie die anderen Feder Anmerkungen bearbeiten möchten, müssen Sie

context:annotation-config> . 

registrieren, um Frühling zu fragen, für die Anmerkungen in den definierten Bohnen zu suchen.

Zusammengefasst

Kontext: Komponente-scan: wird Bohnen innerhalb der Verpackung instanziieren, wenn sie mit geeigneten Annotations

annotiert sind Kontext: Annotation-config: werden die Anmerkungen in der konfigurierten Prozess Beans unabhängig davon, ob sie über Annotationen oder XML definiert sind.