Spring 框架中的 Component 与 Bean 注解

Spring Boot 中的 @Bean 与 @Component

Spring 的 @Component
和 @Bean
注解的关键区别在于:@Bean
注解可用于暴露您自己编写的 JavaBeans,而 @Component
注解可用于暴露源代码由他人维护的 JavaBeans。Spring 框架的核心是其控制反转 (IoC) 容器,它管理着应用程序中最重要的 JavaBeans 的生命周期。然而,IoC 容器并不管理应用程序可能需要的每一个 JavaBean。它只管理您明确要求它管理的 JavaBeans 的生命周期。何时使用 Spring 的 @Bean 注解?如果您自己编写了一个 JavaBean,可以直接在源代码中添加 Spring 的 @Bean
注解。这里我们要求 Spring 的 IoC 容器管理 Score 类所有实例的生命周期。
何时使用 Spring 的 @Component 注解?但是,如果您想让 Spring 的 IoC 容器管理来自 Jackson API 的 ObjectMapper
,或者来自 JDBC API 的 DataSource
组件呢?您不能简单地编辑 JDK 中的代码并在标准 API 的类上添加 @Bean
注解。这就是 @Component
注解的用武之地。如果您希望 Spring 管理一个您无法控制其代码的 JavaBean,您可以创建一个返回该 JavaBean 实例的方法,然后用 @Component
注解装饰该方法,如下例所示:
在此示例中,我们使用了 @Component
注解来告诉 Spring IoC 容器管理 DataSource
和 ObjectMapper
bean 的生命周期。这些组件来自 Jackson 和 JDBC API,因此我们无法编辑其源代码。这就是为什么我们不能直接在类声明上方添加 @Bean
注解的原因。但是,我们可以使用 @Component
注解,并结合放在类文件本身的 @Configuration
注解,来告诉 Spring 管理这些外部提供的资源。用 @Component 代替 @Bean?@Component
注解并不仅限于与外部 API 一起使用。开发者完全允许使用 @Component
注解代替 @Bean
注解来暴露他们自己编写的 JavaBeans。如果我们从上方的 Score
类中移除 @Bean
注解,我们可以像下面代码中看到的那样,通过使用 @Component
注解来通过 IoC 容器暴露 Score
:
何时使用 @Component vs @Bean?在具有一定规模的 Spring Boot 项目中,我实际上更倾向于使用 @Component
注解而不是 @Bean
注解。这样,配置被限制在单个文件中,而您编写的 JavaBeans 不会被那些将您的源代码紧密绑定到 Spring 框架的注解所充斥。在较小的项目和原型中?我完全支持使用 @Bean
注解。它更容易使用,并且如果您的项目不需要大量配置,它可以帮助您更快地启动和运行您的微服务。
版权声明: 本文为 InfoQ 作者【码语者】的原创文章。
原文链接:【http://xie.infoq.cn/article/da2f2e7b997ef19eaa157c45f】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论