2012-08-10 11 views
10

Ich stieß auf zwei Anmerkungen von Frühjahr 3 (@Component und @Configuration) Ich bin ein wenig verwirrt zwischen diesen. Hier
ist, was ich über @Component lesenUnterschied zwischen @Component und @Konfiguration im Frühjahr 3

Diesen „Kontext: Komponente“ in Bean-Konfigurationsdatei, bedeutet dies, Auto-Scan-Funktion im Frühjahr aktivieren. Das Basispaket gibt an, wo Ihre Komponenten gespeichert sind, Spring scannt diesen Ordner und findet die Bean (mit @Component annotiert) und registriert sie in Spring Container.

Ich frage mich, was So ist die Verwendung von @Configuration dann, wenn @Controller wird meine Bohnen, ohne die Notwendigkeit registrieren, sie im Frühjahr XML-Konfigurationsdatei ist

Antwort

8

@Configuration zu erklären, das Herz der Java-basierte Konfiguration Mechanismus, der im Frühjahr 3 eingeführt wurde. Es bietet eine Alternative zur XML-basierten Konfiguration.

So sind die 2 folgenden Schnipsel sind identisch:

<beans ...> 
    <context:component-scan base-package="my.base.package"/> 
    ... other configuration ... 
</beans> 

und:

@Configuration 
@ComponentScan(basePackages = "my.base.package") 
public class RootConfig { 
    ... other configuration ... 
} 

In beiden Fällen Frühling in my.base.package scannen und unten für Klassen mit Anmerkungen versehen mit @Component oder einer der anderen Anmerkungen, die sind meta-annotiert mit @Component wie @Service.

7

Von Book Pro Frühling Integration

@Configuration Klassen sind wie normale @Components Klassen, mit der Ausnahme, dass mit @Bean kommentierten Methoden zur Fabrik Bohnen verwendet werden. Beachten Sie, dass ein @Component mit @Bean kommentierten Methoden auf die gleiche Weise funktioniert, mit der Ausnahme, dass Bereiche nicht eingehalten werden und die @Bean Methoden wieder aufgerufen werden (kein Caching im Spiel ist), so @Configuration bevorzugt wird, obwohl es CGLIB

+6

„Das ist ein Hinweis ist, wie B, außer dass B wie X. Hinweis verhält, dass A verhält sich auch wie X. " Groß. –

0

erfordert hier Unterschied mit vollem Beispiel: -

//@Configuration or @Component 
public static class Config { 
    @Bean 
    public A a() { 
     return new A(); 
    } 
    //**please see a() method called inside b() method** 
    @Bean 
    public B b() { 
     return new B(a()); 
    } 
} 

1) Hier, wenn Config-Klasse mit @configuration kommentierte, als ein() -Methode und b() -Methode, werden beide einmal genannt werden. Hier, wenn Config Klasse

2) mit @component kommentierten, als ein() -Methode wird einmal aber b() -Methode aufgerufen wird zweimal aufgerufen werden.

Problem in (2): - da wir das Problem mit @compenent Annotation bemerkt haben. Diese zweite Konfiguration (2) ist völlig inkorrekt, weil Spring eine Singleton-Bean von A erzeugt, aber B eine weitere Instanz von A erhält, die sich außerhalb der Spring-Kontextsteuerung befindet.

Lösung: - Wir können @autowired Annotation mit @ Komponent Annotation innerhalb der Config-Klasse verwenden.

@Component 
public static class Config { 
    @Autowired 
    A a; 

    @Bean 
    public A a() { 
     return new A(); 
    } 

    @Bean 
    public B b() { 
     return new B(a); 
    } 
} 
+1

Ich denke, dass b einmal und zweimal aufgerufen wird (2 –

0

Das ist zwar alt, aber auf JavaBoy Und Vijay die Antworten erarbeiten, mit einem Beispiel:

@Configuration 
public class JavaConfig { 
    @Bean 
    public A getA() { 
     return new A(); 
    } 
} 

@Component 
@ComponentScan(basePackages="spring.example") 
public class Main() { 
    @Bean 
    public B getB() { 
     return new B(); 
    } 
    @Autowired 
    JavaConfig config; 

    public static void main(String[]a) { 
     Main m = new AnnotationConfigApplicationContext(Main.class) 
      .getBean(Main.class); 
     /* Different bean returned everytime on calling Main.getB() */ 
     System.out.println(m.getB()); 
     System.out.println(m.getB()); 
     /* Same bean returned everytime on calling JavaConfig.getA() */ 
     System.out.println(m.config.getA()); 
     System.out.println(m.config.getA()); 
    } 
} 
Verwandte Themen