2012-08-10 1 views
10

Я наткнулся на две аннотации, предоставленные Spring 3 (@Component и @Configuration) Я немного смущен между ними.
Вот что я прочитал о @Componentразница между @Component и @Configuration весной 3

Put этот «контекст: компонент» в конфигурационном файле боб, это означает, включить автоматическую функцию сканирования в Spring. Базовый пакет указывает , где хранятся ваши компоненты, Spring сканирует эту папку и узнает компонент (аннотируется с помощью @Component) и зарегистрирует его в Весенний контейнер.

Так мне интересно, что использование @Configuration тогда, если @Controller зарегистрирует свои бобы без необходимости декларировать их в конфигурационном файле XML ярового

ответ

8

@Configuration является сердцем конфигурации Java на основе механизм, который был введен весной 3. Он предоставляет альтернативу конфигурации на основе XML.

Таким образом, 2 Следующие фрагменты идентичны:

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

и:

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

В обоих случаях Пружина будет сканировать в my.base.package и ниже для классов, аннотированных @Component или одного из других аннотаций мета-аннотируются @Component, например @Service.

7

Из книги Pro Spring Integration

@Configuration классы как обычные @Components классов, за исключением того, что методы аннотированные с @Bean используются заводские фасолью. Обратите внимание, что @Component с @Bean аннотированных методов работает точно так же, за исключением того, что объемы не соблюдаются и @Bean методы повторно не вызывается (без кэширования в игре), так @Configuration является предпочтительным, даже если это требует CGLIB

+6

«Обратите внимание, что, как B, за исключением, что B ведет себя как X. Заметим, что А также ведет себя как ИКС." Отлично. –

0

Вот разница с полным, например: -

//@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) Здесь, если Config класса с аннотацией @configuration, чем метод() и Ь(), как будет называться раз.

2) Здесь, если класс Config аннотируются @component, чем метод() будет называться раз но метод B() будет называться дважды.

Проблема в (2): - поскольку мы заметили проблему с @compenent аннотацией. Эта вторая конфигурация (2) абсолютно неверна, потому что весна создаст одноэлементный компонент A, но B получит другой экземпляр A, который находится вне контекстного управления весной.

Решение: - мы можем использовать аннотацию @autowired с аннотацией @component внутри класса Config.

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

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

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

Я думаю, что b будет называться один раз и дважды в (2 –

0

Хотя это старый, но уточняя JavaBoy And Виджай в ответах, с примером:

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

 Смежные вопросы

  • Нет связанных вопросов^_^