面试官问:请说说 @Configuration 和 @Component 的区别?

37 阅读2分钟

在Java的Spring框架中,@Configuration@Component都是用于定义Spring容器中的Bean,但它们的用途和工作方式有所不同。

@Configuration

@Target(ElementType.TYPE)  
@Retention(RetentionPolicy.RUNTIME)  
@Documented  
@Component  
public @interface Configuration {  
    String value() default "";  
}
  1. 定义@Configuration是一个类级别的注解,它标识这个类是一个Spring配置类。这个注解通常与@Bean注解一起使用,用于定义Spring容器中的Bean。

  2. 用途:在一个配置类(用@Configuration注解的类)中,可以通过定义方法并使用@Bean注解来声明Spring容器中的Bean。这种方式常用于配置和初始化那些不能通过组件扫描注册为Spring Bean的类,如第三方库的组件。

  3. 特点

    • @Configuration类中的方法可以通过调用其他@Bean方法来支持Bean之间的依赖。
    • 它支持完整的Spring功能,包括依赖注入和事务管理。
    • 当一个方法标记为@Bean被调用时,Spring容器将检查该Bean是否已经创建,以确保每个@Bean方法只创建一个实例。

@Component

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {
    String value() default "";
}
  1. 定义@Component也是一个类级别的注解,用于标记一个类作为Spring组件。当启用组件扫描时(例如通过@ComponentScan注解),Spring会自动检测这些类,并将它们注册为Bean。

  2. 用途@Component用于那些直接声明为Spring组件的类,常用于业务层(service)、数据访问层(repository)、表现层(controller)等。

  3. 特点

    • @Component是一个泛化的概念,专门用于组件扫描。
    • 它的衍生注解如@Service@Repository@Controller等有特定的用途,可以为特定类型的组件提供附加的语义。

总结

  • @Configuration用于定义配置类,主要用于方法级别的Bean定义。
  • @Component用于普通组件的声明,使其成为Spring容器管理的Bean。
  • 在某些情况下,@Configuration类可能也会被标记为@Component,但这通常用于特定的配置目的。
  • 使用@Configuration@Bean可以提供更细粒度的控制和复杂的依赖注入设置,而@Component及其衍生注解更侧重于自动检测和注册。