разница между @Component и @Configuration весной 3

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

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

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

4 ответов


@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.


Из Книги Про Весеннюю Интеграцию

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


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

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

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

//@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, чем метод A() и метод b (), оба будут называться после .

2) здесь, если класс Config аннотирован @component, то метод () будет называться после но метод b () будет называться два раза .