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

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

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

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


person Anand    schedule 10.08.2012    source источник


Ответы (5)


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

Итак, два следующих фрагмента идентичны:

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

и:

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

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

person Rich Cowin    schedule 31.08.2012

Из Book Pro Spring Integration

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

person Javaboy    schedule 17.01.2015
comment
Обратите внимание, что A похож на B, за исключением того, что B ведет себя как X. Обратите внимание, что A также ведет себя как X. Отлично. - person Alexander Torstling; 11.01.2016

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

//@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(), оба будут вызываться once.

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

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

Решение: мы можем использовать аннотацию @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);
    }
}
person Vijay    schedule 23.01.2017
comment
Я думаю, что b будет вызываться один раз, а a дважды в (2 - person Nick Allen; 03.09.2017

Хотя это старо, но разрабатывает ответы JavaBoy And Vijay с примером:

@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());
    }
}
person ksceriath    schedule 27.08.2017

@Component — это аннотация общего стереотипа, которая может указывать на любой из компонентов-кандидатов, т.е. @Repository, @Service, @Controller и эти кандидаты имеют право на автоматическое обнаружение.

В то время как @Configuration используется для создания компонента, который используется структурой Spring для создания контекста приложения, внутри @Configuration используется @Component, поэтому имеет смысл даже то, что это компонент Spring, который создает сама структура.

person raj240    schedule 22.06.2019