我遇到了Spring 3提供的两个注释(@Component和@Configuration)
我对它们有点困惑。
这是我读到的关于@Component
将这个“context:component”放在bean配置文件中,这意味着, 在Spring中启用自动扫描功能。指示基本包 存储组件的位置,Spring将扫描此文件夹和 找出bean(用@Component注释)并注册它 弹簧容器。
所以我想知道@Configuration的用途是什么,如果@Controller将注册我的bean而不需要在spring配置xml文件中声明它们
答案 0 :(得分:14)
来自Book Pro Spring Integration
@Configuration
类与常规@Components
类一样,除了用@Bean
注释的方法用于工厂bean。请注意,带有@Component
注释方法的@Bean
的工作方式相同,只是不考虑范围并重新调用@Bean
方法(播放时没有缓存),因此{{1首选,即使它需要CGLIB
答案 1 :(得分:9)
@Configuration
是Spring 3中引入的基于Java的配置机制的核心。它提供了基于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
答案 2 :(得分:6)
以下是完整示例的区别: -
//@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)这里如果使用@component注释Config类,则a()方法将被称为一次,但b()方法将被称为两次。
(2)中的问题: - 因为我们已经注意到@compenent注释的问题。 第二个配置(2)完全不正确,因为spring将创建一个A的单例bean,但是B将获得另一个不属于spring上下文控件的A实例。
解决方案: - 我们可以在Config类中使用带有@component注释的@autowired注释。
@Component
public static class Config {
@Autowired
A a;
@Bean
public A a() {
return new A();
}
@Bean
public B b() {
return new B(a);
}
}
答案 3 :(得分:2)
虽然这已经过时了,但是详细阐述了JavaBoy和Vijay的答案,并举了一个例子:
run_callbacks
答案 4 :(得分:0)
@Component
是一种通用构造型注释,它可以指示任何候选组件,即: @Repository, @Service, @Controller
,并且这些候选人都有资格进行自动检测。
在@Configuration
用于创建由spring框架用于创建应用程序上下文的组件的情况下,内部@Configuration
在@Component
的使用使得它甚至是Spring都是有道理的框架本身创建的组件。