注解本身无生命周期,真正有生命周期的是被@component或@service声明的bean实例;它们触发spring扫描并创建bean,经历实例化、属性注入(@autowired在此阶段生效)、初始化、使用到销毁全过程。

@Component、@Service、@Autowired 这三个注解本身没有生命周期——它们是编译期或启动期的元数据标记,不是运行时对象,不经历“创建→使用→销毁”的过程。
真正有生命周期的是被这些注解声明出来的 Bean 实例,也就是 Spring 容器管理的对象。
@Component 和 @Service 的作用是声明 Bean
这两个属于类级别构造型注解,功能一致,只是语义不同:
-
@Component是通用组件标识,适用于任何被 Spring 管理的普通类; -
@Service是它的特化形式,专用于服务层类(语义更清晰,便于分层识别和 AOP 切面匹配)。
它们触发的是 Spring 扫描机制:容器在启动时扫描到这类类,就会按规则(如单例默认)创建对应 Bean 实例,并进入完整的 Bean 生命周期流程。
@Autowired 是依赖注入的声明方式
它不参与生命周期阶段,而是在属性填充阶段(Population of Properties) 起作用:
- 容器在实例化 Bean 后,会解析该注解,查找匹配的依赖 Bean;
- 若找到,就完成字段、构造器或 Setter 方法的注入;
- 如果注入失败(如找不到候选 Bean),默认抛异常,可通过
required = false或配合@Qualifier/@Resource控制行为。
这个过程发生在 Bean 实例化之后、初始化方法执行之前。
真正走完整生命周期的是 Bean 实例
一个被 @Component 或 @Service 标记的类,其对应 Bean 的生命周期包含以下关键阶段:
- 实例化(调用构造方法)
- 属性赋值(含
@Autowired注入) - 初始化前回调(如
@PostConstruct、InitializingBean.afterPropertiesSet()) - 初始化后(如
BeanPostProcessor.postProcessAfterInitialization()) - 使用中(被其他 Bean 引用、处理业务)
- 销毁前回调(如
@PreDestroy、DisposableBean.destroy())
这些阶段由 Spring IoC 容器统一调度,与 JVM 的 GC 生命周期无关。
小结:别混淆“注解”和“被注解的 Bean”
- 注解是静态标签,只在类加载或容器启动时起作用;
- 生命周期属于容器创建并托管的那个 Bean 对象;
-
@Component/@Service决定“要不要管”,@Autowired决定“怎么连”,而整个生命周期流程由 Spring 容器自动驱动。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











