Spring 3中@Component和@Configuration之间的区别

时间:2012-08-10 13:49:03

标签: java spring spring-3

我遇到了Spring 3提供的两个注释(@Component@Configuration) 我对它们有点困惑。
这是我读到的关于@Component

的内容
  

将这个“context:component”放在bean配置文件中,这意味着,   在Spring中启用自动扫描功能。指示基本包   存储组件的位置,Spring将扫描此文件夹和   找出bean(用@Component注释)并注册它   弹簧容器。

所以我想知道@Configuration的用途是什么,如果@Controller将注册我的bean而不需要在spring配置xml文件中声明它们

5 个答案:

答案 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都是有道理的框架本身创建的组件。