注解不生效的根本原因是未被正确读取或处理:一是注解未声明@retention(retentionpolicy.runtime),导致反射无法获取;二是未配置@target或贴错位置;三是缺乏消费注解的处理逻辑(如aop、反射代码);四是调用方式绕过代理机制。

注解不生效,不是注解“坏了”,而是它没被正确读取或触发。核心就两点:注解本身是否能被看到,以及有没有代码去处理它。
看注解能不能被反射读到
这是最常踩的坑。如果你打算在运行时用反射获取注解(比如写拦截器、AOP切面),那注解必须声明为 RetentionPolicy.RUNTIME。否则反射调用 getAnnotation() 或 isAnnotationPresent() 一定返回 null。
- 没写
@Retention?默认是CLASS,反射拿不到 - 写了
@Retention(RetentionPolicy.SOURCE)?只给编译器看,连字节码都没有 - 写了
@Retention(RetentionPolicy.CLASS)?字节码里有,但 JVM 不加载进运行时,反射照样看不到
看注解贴的位置对不对
每个注解都通过 @Target 规定了能用在哪。贴错地方,编译器可能直接忽略,或者 IDE 给警告但不报错,结果就是“没效果”。
- 把
@RequestMapping加在字段上?它只支持METHOD和TYPE - 把
@Transactional加在 private 方法上?Spring AOP 只代理 public 方法 - 自定义注解没配
@Target?默认只能用在类上,方法上加了也无效
看有没有代码真正去“消费”这个注解
注解只是标签,不是开关。没人读它,它就等于不存在。
- 你写了
@MyLog,但没写 AOP 切面或拦截器去扫描并执行日志逻辑 - Spring 的
@Component没被组件扫描路径覆盖?类加载了,注解也存在,但 Spring 根本没扫到 - Lombok 注解失效?大概率是 IDE 没启用 annotation processor,或者 Maven 缺少
maven-compiler-plugin配置
看调用方式有没有绕过代理机制
像 @Transactional、@Cacheable 这类基于 Spring AOP 的注解,依赖代理对象拦截方法调用。一旦调用方式不经过代理,注解就失效。
- 同一类中,
this.method()直接调用 —— 走的是本类对象,不是代理对象 - 方法是 private/protected/default 访问级别 —— Spring 默认不代理非 public 方法
- 多线程环境下,在子线程里调用带事务的方法 —— 事务绑定当前线程,子线程没有上下文
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











