一、注解的本质与元注解
注解本质是继承java.lang.annotation.Annotation
的接口,通过元注解(注解的注解)控制其行为:
@Target(ElementType.METHOD) // 仅用于方法
@Retention(RetentionPolicy.RUNTIME) // 运行时保留
public @interface PerformanceMonitor {
String value() default "defaultTask"; // 注解元素
long threshold() default 1000; // 执行阈值(ms)
}
@Target
:指定注解适用位置(类、字段、方法等)@Retention
:决定注解信息保留阶段(SOURCE/CLASS/RUNTIME)
二、运行时注解处理:反射+AOP实践
结合Spring AOP,实现方法级性能监控:
@Aspect
@Component
public class PerfMonitorAspect {
@Around("@annotation(monitor)") // 拦截带PerformanceMonitor注解的方法
public Object logPerformance(ProceedingJoinPoint pjp, PerformanceMonitor monitor) throws Throwable {
long start = System.currentTimeMillis();
Object result = pjp.proceed();
long time = System.currentTimeMillis() - start;
if (time > monitor.threshold()) {
System.out.printf("[WARN] %s 执行耗时 %dms (阈值: %dms)%n",
monitor.value(), time, monitor.threshold());
}
return result;
}
}
// 使用注解监控业务方法
@Service
public class OrderService {
@PerformanceMonitor(value = "createOrder", threshold = 500)
public void createOrder() {
// 模拟业务逻辑
try { Thread.sleep(600); } catch (InterruptedException e) {}
}
}
输出示例:
[WARN] createOrder 执行耗时 600ms (阈值: 500ms)
三、编译时注解:Lombok原理揭秘
如@Getter
注解在编译时自动生成代码:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE) // 仅需源码阶段
public @interface CustomGetter {}
// 注解处理器(简化版)
@SupportedAnnotationTypes("com.example.CustomGetter")
public class GetterProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment env) {
// 遍历被@CustomGetter注解的类,动态生成getter方法
// 具体实现需操作AST(抽象语法树)
return true;
}
}
四、框架级注解:Spring的@Autowired魔法
Spring通过@Autowired
实现依赖注入:
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Autowired {
boolean required() default true; // 关键配置元素
}
// 底层处理:AutowiredAnnotationBeanPostProcessor扫描注解,
// 通过反射动态注入Bean实例
关键结论:
- 解耦利器:注解分离核心逻辑与辅助功能(日志/事务等)
- 动态扩展:运行时注解+反射实现行为增强
- 代码生成:编译时注解操作AST自动生成样板代码
- 框架基石:Spring等通过注解实现IOC/AOP等核心机制
掌握自定义注解,等于获得Java元编程的钥匙——用声明代替硬编码,大幅提升架构灵活性。