Spring注解本质是容器启动时由不同后置处理器识别并执行的指令,按五大职责分类:Bean定义类(@Component等)、依赖注入类(@Autowired等)、配置驱动类(@Configuration等)、切面增强类(@Aspect等)、环境与行为控制类(@Profile、@Transactional等),分别由ConfigurationClassPostProcessor和AutowiredAnnotationBeanPostProcessor等核心处理器在生命周期各阶段处理。

不用死记硬背,关键在理解分类逻辑和运行时角色。Spring注解不是孤立的标签,而是容器启动过程中被不同后置处理器(BeanFactoryPostProcessor、BeanPostProcessor)识别并执行特定动作的“指令”。背之前先理清两条主线:它属于哪一类职责?由哪个组件处理?
按五大职责分类记忆
所有常用注解都能归入这五类,每类对应一个核心目的,面试时按类展开,条理清晰:
-
Bean定义类:@Component、@Service、@Repository、@Controller —— 告诉容器“这个类要注册成Bean”;底层由
ConfigurationClassPostProcessor扫描并封装为BeanDefinition -
依赖注入类:@Autowired、@Resource、@Value —— 告诉容器“这个字段/方法需要填什么值”;由
AutowiredAnnotationBeanPostProcessor或CommonAnnotationBeanPostProcessor在实例化后注入 -
配置驱动类:@Configuration、@Bean、@Import、@PropertySource —— 替代XML,声明式定义Bean;
ConfigurationClassPostProcessor是解析主力,会把 @Bean 方法包装成 BeanDefinition -
切面增强类:@Aspect、@Before、@Around、@EnableAspectJAutoProxy —— 触发AOP代理生成;靠
AnnotationAwareAspectJAutoProxyCreator在初始化前后织入逻辑 -
环境与行为控制类:@Profile、@Conditional、@Scope、@Transactional —— 控制Bean是否创建、何时生效、如何代理;分别由
ConditionEvaluator、ScopedProxyFactoryBean、TransactionInterceptor等协同处理
抓住两个核心处理器
只要记住这两个类,大部分注解的“谁来管、什么时候动”就清楚了:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- ConfigurationClassPostProcessor:Spring启动早期执行,负责解析所有配置类相关注解(@Configuration、@Bean、@ComponentScan、@Import、@PropertySource),是“BeanDefinition 的源头生产者”
- AutowiredAnnotationBeanPostProcessor:在Bean实例化之后、初始化之前介入,专盯 @Autowired / @Value / @Inject,完成字段和方法的自动装配
高频易混点对比记
单独拎出三组常考区别,用一句话说清本质:
立即学习“Java免费学习笔记(深入)”;
- @Autowired vs @Resource:前者按类型(byType)匹配,后者默认按名称(byName)匹配;@Autowired 是 Spring 原生,@Resource 是 JSR-250 标准
- @Component vs @Configuration:@Component 注册普通Bean,@Configuration 类本身是Bean,且其 @Bean 方法会被CGLIB增强以保证单例语义
- @Scope("prototype") vs 多线程安全:prototype 解决的是 Bean 实例隔离,不等于线程安全;线程安全取决于是否有共享可变状态
结合生命周期讲注解时机
把注解放到 Spring Bean 生命周期里看,立刻有画面感:
- 扫描阶段 → @Component 等被 ConfigurationClassPostProcessor 发现,注册为 BeanDefinition
- 实例化阶段 → 反射创建对象,此时 @PostConstruct 还没执行
- 属性填充阶段 → @Autowired / @Value 生效,依赖注入完成
- 初始化阶段 → @PostConstruct、InitializingBean.afterPropertiesSet、@Bean(initMethod) 依次执行
- 代理生成阶段 → @Transactional、@Async、@Cacheable 等触发 AOP 代理创建

















