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。
