spring:Spring Bean 常用注解及生命周期

一、常用Bean注解

注解属于哪类Spring 会做什么用在什么地方备注
@Component通用组件注解把类注册成 Bean任何普通类四大注解的父类注解
@Service业务层组件注册成 Bean + 表示业务逻辑组件Service 层语义更清晰,功能与 @Component 相同
@Repository数据层组件注册成 Bean + 捕获数据库异常DAO/Mapper 层比 @Component 多“异常转换”功能
@ControllerWeb 控制层注册成 Bean + 处理 Web 请求Controller 层用于 MVC 控制器
@Configuration配置类注册成 Bean + 支持 @Bean写配置的类相当于 XML 配置文件的替代
@Bean方法级注解方法返回的对象注册为 Bean配置类内部的方法用来手动创建 Bean

二、层次体系

                     Spring Bean 注解体系
─────────────────────────────────────────────────────────────────────

                         @Component
                              │
          ┌───────────────┬───────────────┬───────────────┐
          │               │               │               │
     @Service       @Repository      @Controller    @Configuration
     (业务层)       (数据层)        (控制层)        (配置类)
                                                          │
                                                          │
                                                       @Bean
                                                     (方法级别)
─────────────────────────────────────────────────────────────────────

三、区别

1)@Component:

“我就是一个普通 Bean,请 Spring 注册我。”

2)@Service:

“我是业务逻辑 Bean(Service 层)。”

3)@Repository:

“我是数据访问 Bean(DAO 层),
顺便帮你把数据库异常转成 Spring 异常体系。”

4)@Controller:

“我是 Web 控制器,负责处理请求与返回结果。”

5)@Configuration:

“我是配置类,用来替代 XML 配置文件。”

6)@Bean:

“我是由方法创建的 Bean,你想怎么 new 我都行。”


四、Q&A

Q:@Service 和 @Component 有什么本质区别?

本质没区别,功能完全一样。
区别只是语义,让别人读代码更清晰。

Q:@Controller 能不能用 @Component 替代?

技术上可以,但你会丢失 Web 功能(比如处理请求)。
所以 @Controller 是必须的。

Q:@Configuration 和 @Component 的关系?

@Configuration 其实是一个特殊的 @Component。
它是为了让类内部的 @Bean 生效。

五、Spring Bean生命周期

                  Spring 创建 Bean 的完整生命流程
────────────────────────────────────────────────────────────
1. 实例化(new)  
      ↓
2. 属性赋值(依赖注入 DI)
      ↓
3. 调用 BeanNameAware / BeanFactoryAware / ApplicationContextAware
      ↓
4. BeanPostProcessor 前置处理(postProcessBeforeInitialization)
      ↓
5. 初始化(@PostConstruct / afterPropertiesSet / init-method)
      ↓
6. BeanPostProcessor 后置处理(postProcessAfterInitialization)
      ↓
7. Bean(可用了)

───────────────────────────────────────────────────────────
(程序关闭时)
8. 销毁(@PreDestroy / destroy-method)
───────────────────────────────────────────────────────────
① 实例化对象(new Bean)

Spring 通过 反射机制 调用构造方法:



UserService userService = new UserService();

这一步 Bean 已经创建,但里面依赖的其他对象还没注入。


② 属性赋值(依赖注入 DI)

Spring 会进行:

  • 字段注入 @Autowired

  • setter 注入

  • 构造器注入

  • @Resource 注入

也就是:



把外部依赖注入进去

这一步做完,Bean 才是“有内容”的。


③ 调用 Aware 接口(可选)

如果某个类实现了这些接口:

  • BeanNameAware → 得到 bean 的名字

  • BeanFactoryAware → 得到 BeanFactory

  • ApplicationContextAware → 得到 ApplicationContext

Spring 会自动调用里面的 setter:



setBeanName() setBeanFactory() setApplicationContext()

让你“感知” Spring 运行环境。


④ BeanPostProcessor 前置处理

如果容器内有 BeanPostProcessor,它会对 Bean 做额外操作。

例如:

  • 注解处理器

  • AOP 代理创建

  • @Autowired 处理器

这一步很关键,因为 AOP 的代理对象就是这里生成的。


⑤ 初始化阶段(Initialization)

Spring 会按顺序执行下面几类初始化方法:

1)@PostConstruct 注解的方法

@PostConstruct public void init1() {}

2)实现 InitializingBean 接口的 afterPropertiesSet() 方法

3)init-method 指定的方法



<bean init-method="init"/>

或 Java:



@Bean(initMethod = "initMethod")

👉 这三者执行顺序是:



@PostConstruct afterPropertiesSet() init-method

初始化是 Bean 可以正常使用前的最后一步。


⑥ BeanPostProcessor 后置处理

前面步骤 4 的“后置版”。

主要作用:

  • 创建 AOP 代理

  • 生成增强类

  • 做一些扩展初始化逻辑

这一步执行完,Bean 才是真正的“最终版本”。

最终的 Bean 可能已经是代理对象,而不是原始对象。


⑦ Bean 进入使用阶段(就绪)

到这一刻为止,Bean 才能被项目正常使用。

例如:

  • 被 @Autowired 注入到其他 Bean

  • 被 Controller 调用

  • 被业务逻辑使用

流程到这里算完整结束。


⑧ Spring 容器关闭 → 销毁阶段

如果 Bean 有销毁方法:

  • @PreDestroy

  • DisposableBean 接口的 destroy()

  • destroy-method 指定的方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值