讲讲@Configuration 和 @Component 的区别
大约 3 分钟
一句话回答
@Configuration
用于定义配置类,其中包含了用@Bean
注解定义的 bean 创建方法,用于配置 Spring 容器。@Component
用于标记普通的 Spring bean 类,它们可以是服务类、数据访问对象或其他组件,用于自动扫描和注册到 Spring 容器。
详细回答
- @Configuration:
@Configuration
是一个特殊的 Spring 注解,它用于标记一个类,表明这个类是一个配置类。配置类通常包含了一组用于定义 Spring bean 的方法。- 配置类中的方法通常使用
@Bean
注解来定义 bean 对象,并且这些方法可以包含复杂的逻辑,以创建和配置 bean。 @Configuration
类通常用于 Java 配置方式,它允许你以编程方式配置 Spring 容器。这对于集中管理应用程序的配置非常有用。
@Configuration
public class MyConfiguration {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
- @Component:
@Component
是一个通用的 Spring 注解,用于标记一个类,表明这个类是一个 Spring bean。通常,它被用于定义业务逻辑组件、服务类、数据访问对象等。@Component
注解的类会被自动扫描并注册到 Spring 容器中,因此它们可以被其他类注入和使用。@Component
注解的类通常用于基于注解的组件扫描方式,Spring 会自动发现这些组件并将它们注册到容器中。
@Component
public class MyComponent {
// ...
}
@Bean 注解方法执行策略
Spring 中的 @Bean
注解通常用于在配置类(被 @Configuration
注解标记的类)中定义方法,这些方法用于创建和配置 Spring bean 对象。@Bean
注解方法的执行策略如下:
方法调用:
- 当 Spring 容器初始化时,会扫描配置类中的
@Bean
注解方法。 - 对于每个
@Bean
注解方法,Spring 容器将调用该方法来创建 bean 实例。
- 当 Spring 容器初始化时,会扫描配置类中的
Bean 的作用域:
@Bean
注解的方法默认情况下,创建的 bean 是单例的,也就是说在容器中只存在一个实例。这是因为@Configuration
注解默认启用了@Scope("singleton")
。- 你可以使用
@Scope
注解来指定其他作用域,如原型(@Scope("prototype")
)或请求作用域(@Scope("request")
)等。
@Configuration
public class MyConfiguration {
@Bean
public MyBean myBean() {
return new MyBean(); // 创建 MyBean 实例
}
}
- 方法调用参数:
@Bean
注解方法可以具有方法参数,这些参数通常用于引用其他 bean 或者传递配置信息。- Spring 容器会自动解析这些参数,然后将所需的 bean 注入到方法中。
@Configuration
public class MyConfiguration {
@Bean
public MyOtherBean myOtherBean() {
return new MyOtherBean();
}
@Bean
public MyBean myBean(MyOtherBean myOtherBean) {
return new MyBean(myOtherBean); // 通过参数注入 myOtherBean
}
}
- 条件装配:
- 你可以使用条件注解(如
@Conditional
)来控制是否创建某个@Bean
。 - 如果条件不满足,Spring 将不会调用
@Bean
注解方法创建相应的 bean。
- 你可以使用条件注解(如
@Configuration
public class MyConfiguration {
@Bean
@Conditional(OnProductionCondition.class) // 仅在生产环境下创建该 bean
public MyProductionBean myProductionBean() {
return new MyProductionBean();
}
}