春季3@Component和@Configuration之间的差异

2022-09-03 03:59:36

我遇到了Spring 3提供的两个注释(@Component@Configuration),我有点困惑。
这是我读到的内容@Component

将此“context:component”放在bean配置文件中,这意味着在Spring中启用自动扫描功能。基本包指示您的组件存储在哪里,Spring将扫描此文件夹并找出豆子(标有@Component)并将其注册到Spring容器中。

所以我想知道那么如果将注册我的bean而无需在spring配置XML文件中声明它们,这有什么用。@Configuration@Controller


答案 1

来自 Book Pro 弹簧集成

@Configuration类就像常规类一样,只是用 注释的方法用于工厂 Bean。请注意,带有注释的方法的工作方式相同,只是不尊重范围并且重新调用方法(没有缓存),因此是首选,即使它需要 CGLIB@Components@Bean@Component@Bean@Bean@Configuration


答案 2

以下是与完整示例的区别:-

//@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)这里如果用@configuration注释的Config类,则a()方法和b()方法,两者都将被调用一次

2)这里如果用@component注释的Config类,则b()方法将被调用一次,但a()方法将被调用两次

(2) 中的问题 :- 因为我们注意到了@component注释的问题。第二种配置(2)是完全不正确的,因为弹簧将创建A的单例豆,但B将获得另一个超出弹簧上下文控制的A实例。

解决方案:- 我们可以在Config类内使用@autowired注释和@component注释。

@Component
public static class Config {
    @Autowired
    A a;

    @Bean
    public A a() {
        return new A();
    }

    @Bean
    public B b() {
        return new B(a);
    }
}

推荐