Spring Bean
Bean 的概念
在 Spring 中,被 IoC 容器管理的对象称为 Bean。
Bean 是 Spring 应用的基本组成单元,Spring 容器负责创建、配置和管理这些 Bean。
将类声明为 Bean 的注解
以下是常用的将类声明为 Bean 的注解:
- 通用注解:
@Component
- 分层架构专用注解:
@Service
、@Repository
、@Controller
- Java 配置类注解:
@Bean
、@Configuration
- 其他相关注解:
@Scope
选择合适的注解可以提高代码的可读性,并明确类的职责和层次。例如,@Service
用于服务层,@Repository
用于数据访问层,@Controller
用于控制器层,而 @Component
用于通用组件。
1. 通用注解
@Component
通用的注解,用于标记一个类为 Spring 管理的 Bean。通常用于普通的组件类。@Component public class MyComponent { // class body }
2. 分层架构中的专用注解
Spring 提供了更细化的注解,用于区分不同层次的组件,这些注解本质上是 @Component
的特殊化形式:
@Service
用于标记服务层(Service Layer)的类,表示业务逻辑组件。@Service public class MyService { // class body }
@Repository
用于标记数据访问层(DAO 层)的类,通常与数据库操作相关。Spring 会为@Repository
注解的类提供额外的异常转换支持(将数据库异常转换为 Spring 的统一异常)。@Repository public class MyRepository { // class body }
@Controller
用于标记控制器层(Controller Layer)的类,通常用于处理 HTTP 请求(如 Spring MVC 中的控制器)。@Controller public class MyController { // class body }
3. Java 配置类中的注解
@Bean
用于在 Java 配置类中声明一个 Bean。通常用于配置类中定义第三方库的类或需要自定义初始化的 Bean。@Configuration
用于标记一个类为配置类,通常与@Bean
注解一起使用,定义多个 Bean。@Configuration public class AppConfig { @Bean public MyBean myBean() { return new MyBean(); } }
4. 其他相关注解
@Scope
用于指定 Bean 的作用域(如单例、原型等),可以与上述任何注解一起使用。@Component @Scope("prototype") public class MyComponent { // class body }
相关面试题
@Component 和 @Bean 的区别是什么?
- 如果是自己编写的类,优先使用
@Component
或其派生注解(如@Service
、@Repository
、@Controller
)。 - 如果需要将第三方库的类或需要自定义初始化的对象注册为 Bean,使用
@Bean
。