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中使用自定义元注解?


被折叠的 条评论
为什么被折叠?



