Java基础教程(六十八)注解之定义注解:深度分析Java定义注解,从零到高玩,解锁元编程黑科技!

一、注解的本质与元注解

注解本质是继承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实例

关键结论:

  1. 解耦利器:注解分离核心逻辑与辅助功能(日志/事务等)
  2. 动态扩展:运行时注解+反射实现行为增强
  3. 代码生成:编译时注解操作AST自动生成样板代码
  4. 框架基石:Spring等通过注解实现IOC/AOP等核心机制

掌握自定义注解,等于获得Java元编程的钥匙——用声明代替硬编码,大幅提升架构灵活性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值