разница между @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 () будет называться два раза .