@annotation:Spring AOP 的“精准定位器“

想象你是一位快递员,负责给一个大型社区送快递。社区里有几百户人家,但只有特定家庭需要特殊服务:

  • 普通快递:直接放快递柜
  • 生鲜快递:需要冷藏处理
  • 贵重物品:需要本人签收
  • 药品快递:需要优先配送

@annotation 就像你手中的智能标签扫描器,它能精准识别每个包裹上的特殊标签,让你只对贴有特定标签的包裹提供特殊服务。

一、核心概念:注解就是快递标签

1. 定义标签(创建注解)

java 复制代码
// 生鲜标签
@Target(ElementType.METHOD) // 贴在方法上
@Retention(RetentionPolicy.RUNTIME) // 运行时可见
public @interface FreshDelivery {
    int storageTemp() default 4; // 冷藏温度
}

// 贵重物品标签
public @interface ValuableItem {
    String signatureRequired() default "yes";
}

2. 贴标签(方法添加注解)

java 复制代码
public class DeliveryService {
    
    // 普通快递(无标签)
    public void deliverRegular(String address) {
        System.out.println("普通快递送到" + address);
    }
    
    // 生鲜快递(贴冷藏标签)
    @FreshDelivery(storageTemp = 2)
    public void deliverFreshFood(String address) {
        System.out.println("生鲜送到" + address);
    }
    
    // 贵重物品(贴签收标签)
    @ValuableItem
    public void deliverJewelry(String address) {
        System.out.println("珠宝送到" + address);
    }
}

三、@annotation 就是你的智能扫描器

java 复制代码
@Aspect
@Component
public class DeliveryAspect {
    
    // 扫描生鲜标签
    @Before("@annotation(fresh)")
    public void handleFresh(FreshDelivery fresh) {
        System.out.println("启用冷藏箱,温度设置为: " + fresh.storageTemp() + "℃");
    }
    
    // 扫描贵重物品标签
    @Around("@annotation(valuable)")
    public Object handleValuable(ProceedingJoinPoint pjp, ValuableItem valuable) {
        System.out.println("要求收件人出示身份证");
        System.out.println("需要签收: " + valuable.signatureRequired());
        
        try {
            // 执行配送
            return pjp.proceed();
        } finally {
            System.out.println("已确认签收,拍照存档");
        }
    }
}

四、工作流程:精准服务

实际配送场景:

java 复制代码
public static void main(String[] args) {
    DeliveryService service = getDeliveryService(); // 获取代理对象
    
    service.deliverRegular("A栋101"); // 普通快递
    // 输出: 普通快递送到A栋101
    
    service.deliverFreshFood("B栋202"); // 生鲜快递
    // 输出: 
    // 启用冷藏箱,温度设置为: 2℃
    // 生鲜送到B栋202
    
    service.deliverJewelry("C栋303"); // 贵重物品
    // 输出:
    // 要求收件人出示身份证
    // 需要签收: yes
    // 珠宝送到C栋303
    // 已确认签收,拍照存档
}

五、为什么需要 @annotation?

问题 无注解的解决方案 使用 @annotation 的解决方案
精准定位 按地址筛选:"B栋的都冷藏" 直接扫描包裹标签
差异化服务 所有生鲜统一4℃冷藏 根据标签设置不同温度
扩展性 新增药品配送需修改筛选规则 只需新增药品标签
代码耦合 配送服务需要知道处理逻辑 配送服务只贴标签,不关心处理

六、@annotation 的独特优势

精确制导:像激光制导导弹一样精准定位

java 复制代码
// 只处理带@MedicalDelivery标签的方法
@Around("@annotation(MedicalDelivery)")

参数传递:读取标签上的参数

java 复制代码
@annotation(medical) // 获取注解实例
int priority = medical.priority(); // 读取优先级参数

动态启用:通过标签开关功能

java 复制代码
// 只有带@EnableLogging的方法才记录日志
@Before("@annotation(EnableLogging)")

解耦设计:业务代码只需声明需求

java 复制代码
// 业务方法只需关注自己需要什么
@FreshDelivery(storageTemp=5)
public void deliverDairy() {...}

七、对比其他定位方式

1. 按楼栋配送(包路径匹配)

java 复制代码
// 处理com.delivery.fresh包下所有方法
@Before("execution(* com.delivery.fresh..*(..))")
  • 问题:包内可能有不需要冷藏的普通快递

2. 按物品类型配送(接口匹配)

java 复制代码
// 处理实现Perishable接口的类
@Before("within(com.delivery.Perishable+)")

3. 智能标签扫描(@annotation)

java 复制代码
// 精确处理贴有@FreshDelivery标签的方法
@Before("@annotation(FreshDelivery)")

八 、为什么它叫 @annotation?

在Spring AOP中:

  • @annotation 是一个切点指示符(Pointcut Designator)

  • 它专门用于匹配带有特定注解的方法

  • 语法:@annotation(annotation-type)

    java 复制代码
    // 扫描带@SpecialService标签的方法
    @Before("@annotation(com.example.SpecialService)")

十、总结:@annotation 的本质

它就像快递员的智能标签扫描器:

  1. 识别需求:扫描方法上的注解标签
  2. 精准服务:只为带标签的方法提供增强
  3. 参数读取:获取标签上的配置参数
  4. 解耦设计:业务代码只需声明需求,不关心实现
相关推荐
JosieBook10 分钟前
【多线程】两台机器同时抢一个字典:一次并发 Bug 的排查
java·网络·bug
牛战士coding13 分钟前
LLM 选错工具怎么办?提示词之外还需要确定性规则兜底
java·人工智能
今天的砖头有点烫手啊16 分钟前
Java 序列化到底怎么选?从 Serializable 到 Protobuf 的演进与选型
java·json
Wang's Blog18 分钟前
Java 项目实战: 交友项目 - 登录发送验证码的测试验证与经验复盘
java·开发语言·交友
万少23 分钟前
Qoder sonus模型 20分钟,复刻 马斯克 飞天汽车
前端·后端·算法
夕除27 分钟前
redis--主从还是集群,内存
java·spring·mybatis
百数平台30 分钟前
低代码安全技术实践:表单 / 流程 / 报表三级权限体系设计解析
java·大数据·数据库
白露与泡影33 分钟前
Spring Boot 实现验证码:Hutool-captcha、AJ-Captcha、EasyCaptcha 到底怎么选?
java·spring boot·后端
马优晨43 分钟前
Java中的dto是什么
java·开发语言·java中的dto是什么·java的dto是什么·dto在java中是什么
小蒜学长1 小时前
基于Springboot+Vue的高校教师教学业绩综合管理系统的设计与开发(代码+数据库+LW)
java·数据库·spring boot·后端·教学业绩管理·三级权限