16

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

把这个“context:component”放在bean配置文件中,意思是,在Spring中启用自动扫描功能。base-package 指示您的组件存储在哪里,Spring 将扫描此文件夹并找出 bean(使用 @Component 注释)并将其注册到 Spring 容器中。

所以我想知道@Configurationthen if@Controller将注册我的bean而不需要在spring配置XML文件中声明它们有什么用。

4

5 回答 5

18

来自 Book Pro Spring 集成

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

于 2015-01-17T18:35:25.553 回答
11

这是与完整示例的区别:-

//@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() 方法将被调用一次,但 a() 方法将被调用两次

(2) 中的问题:- 因为我们已经注意到 @component 注释的问题。第二种配置 (2) 完全不正确,因为 spring 将创建 A 的单例 bean,但 B 将获得 A 的另一个实例,该实例不受 spring 上下文控制。

解决方案:- 我们可以在 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);
    }
}
于 2017-01-23T08:37:25.363 回答
10

@Configuration是 Spring 3 中引入的基于 Java 的配置机制的核心。它提供了基于 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 ...
}

在这两种情况下,Spring 都会在内部my.base.package和下面扫描带有注释的类@Component或其他带有元注释的注释之一,@Component例如@Service.

于 2012-08-31T18:49:21.237 回答
2

虽然这是旧的,但详细说明 JavaBoy 和 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());
    }
}
于 2017-08-27T05:31:47.853 回答
1

@Component是一个通用的原型注释,可以指示任何候选组件,即;@Repository, @Service, @Controller这些候选人有资格进行自动检测。

as@Configuration用于创建 spring 框架用来创建应用程序上下文的组件,内部@Configuration使用@Component它是有道理的,即使这是框架本身创建的 spring 组件。

于 2019-06-22T06:19:41.427 回答