一、常用Bean注解
| 注解 | 属于哪类 | Spring 会做什么 | 用在什么地方 | 备注 |
|---|---|---|---|---|
| @Component | 通用组件注解 | 把类注册成 Bean | 任何普通类 | 四大注解的父类注解 |
| @Service | 业务层组件 | 注册成 Bean + 表示业务逻辑组件 | Service 层 | 语义更清晰,功能与 @Component 相同 |
| @Repository | 数据层组件 | 注册成 Bean + 捕获数据库异常 | DAO/Mapper 层 | 比 @Component 多“异常转换”功能 |
| @Controller | Web 控制层 | 注册成 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 指定的方法

被折叠的 条评论
为什么被折叠?



