Java Spring 框架技术从入门到放弃:Spring生态之Spring 元注解开发,常见Spring元注解学习笔记

Java Spring 框架技术从入门到放弃:Spring生态之Spring 元注解开发学习笔记

一、元注解概述

概念

元注解是用于注解其他注解的注解。在 Spring 中,元注解为自定义注解提供了基础,让开发者可以根据业务需求创建具有特定功能的注解,从而简化代码和提高开发效率。

生活案例

想象你是一家餐厅的老板,你有不同类型的菜单,如早餐菜单、午餐菜单和晚餐菜单。你可以为每种菜单设计一个特殊的标记(类似于注解),而这些标记的设计规则和标准(如颜色、样式)就像是元注解,它们定义了如何创建和使用这些具体的菜单标记。

二、常见元注解及其作用

1. @Target

作用

指定注解可以应用的目标元素类型,如类、方法、字段等。

生活案例

在餐厅里,不同的标记(注解)有不同的使用位置。例如,“特价菜品” 标记只能贴在具体的菜品上(对应方法或字段),而 “推荐餐厅” 标记可以挂在餐厅门口(对应类)。

具体应用
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

// 该注解可以应用于类和方法
@Target({ElementType.TYPE, ElementType.METHOD})
@interface MyAnnotation {
    // 注解属性
    String value() default "";
}

// 应用注解到类
@MyAnnotation("这是一个类注解")
class MyClass {
    // 应用注解到方法
    @MyAnnotation("这是一个方法注解")
    public void myMethod() {
        // 方法实现
    }
}

2. @Retention

作用

指定注解的保留策略,即注解在什么阶段有效,如源码阶段、编译阶段或运行阶段。

生活案例

餐厅的菜单标记有不同的保留时间。一些临时的促销标记(如限时折扣)只在促销期间有效(对应源码阶段),而一些长期的特色菜品标记(如招牌菜)会一直保留在菜单上(对应运行阶段)。

具体应用
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

// 该注解在运行时有效
@Retention(RetentionPolicy.RUNTIME)
@interface MyRuntimeAnnotation {
    String value() default "";
}

@MyRuntimeAnnotation("运行时注解")
class MyRuntimeClass {
    // 类实现
}

3. @Documented

作用

指定注解是否会被包含在 JavaDoc 文档中。

生活案例

餐厅的一些重要信息标记(如卫生达标标志)会被记录在餐厅的宣传资料(类似于 JavaDoc 文档)中,方便顾客了解。

具体应用
import java.lang.annotation.Documented;

// 该注解会被包含在 JavaDoc 中
@Documented
@interface MyDocumentedAnnotation {
    String value() default "";
}

@MyDocumentedAnnotation("文档注解")
class MyDocumentedClass {
    // 类实现
}

4. @Inherited

作用

指定注解是否可以被继承。如果一个类使用了带有 @Inherited 注解的注解,那么它的子类也会自动继承该注解。

生活案例

餐厅的品牌特色标记(如百年老店)会随着餐厅的传承而被继承下来,新的分店也会拥有这个标记。

具体应用
import java.lang.annotation.Inherited;

// 该注解可以被继承
@Inherited
@interface MyInheritedAnnotation {
    String value() default "";
}

@MyInheritedAnnotation("可继承注解")
class ParentClass {
    // 父类实现
}

class ChildClass extends ParentClass {
    // 子类自动继承了 @MyInheritedAnnotation 注解
}

三、自定义元注解及应用

自定义元注解示例

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// 定义一个元注解,可应用于类和方法,在运行时有效
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyMetaAnnotation {
    String value() default "";
}

// 使用自定义元注解
@MyMetaAnnotation("自定义元注解应用到类")
class MyCustomClass {
    @MyMetaAnnotation("自定义元注解应用到方法")
    public void myCustomMethod() {
        // 方法实现
    }
}

结合 Spring 框架的应用

在 Spring 中,我们可以使用自定义元注解来简化配置和实现特定的业务逻辑。例如,我们可以创建一个自定义注解来标记需要进行日志记录的方法。

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// 自定义日志注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface Loggable {
    String value() default "";
}

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

// 日志切面
@Aspect
@Component
class LoggingAspect {
    @Pointcut("@annotation(com.example.Loggable)")
    public void loggableMethods() {}

    @After("loggableMethods()")
    public void logMethodExecution(JoinPoint joinPoint) {
        System.out.println("方法 " + joinPoint.getSignature().getName() + " 执行完毕");
    }
}

// 使用自定义日志注解
class MyService {
    @Loggable("业务方法")
    public void doBusiness() {
        System.out.println("执行业务逻辑");
    }
}

四、最佳实践与注意事项

最佳实践

  • 合理使用元注解,根据注解的使用场景和需求选择合适的 @Target 和 @Retention 策略。
  • 注解的命名要清晰,能够准确表达其功能和用途。
  • 结合 AOP 等技术,充分发挥自定义注解的作用,实现代码的解耦和复用。

注意事项

  • 避免过度使用注解,导致代码的可读性和可维护性下降。
  • 在使用 @Inherited 注解时,要注意继承的范围和影响,避免出现意外的结果。

五、预习后续知识

1. 注解处理器

了解如何编写注解处理器,在编译阶段对注解进行处理,实现代码的生成和验证等功能。

2.Spring Boot 自动配置与注解

学习 Spring Boot 如何利用注解实现自动配置,以及如何自定义自动配置注解,简化 Spring 应用的开发。

3. 响应式编程与注解

探索在响应式编程中如何使用注解,如 Spring WebFlux 中的注解,实现异步和非阻塞的开发。

通过学习 Spring 元注解开发,我们可以根据业务需求创建自定义注解,提高代码的灵活性和可维护性。同时,为后续学习更高级的 Spring 技术打下坚实的基础。

分享

详细解释一下@Retention元注解的作用

元注解和普通注解有什么区别?

如何在Spring中使用自定义元注解?

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zl515035644

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值