[Spring]自定义注解
SpringBoot自定义注解实现
在学习SpringBoot过程中,学习了一些SpringBoot特有的注解,大多是为了使用方便将多个注解进行了整合。既然学习到了注解,就来重新认识一下Spring的自定义注解实现过程,在之后学习新注解的实现原理时会更加游刃有余。
SpringBoot实现自定义注解
Java元注解#
Java中提供了四种元注解,用来注解其他的注解,当我们创建自定义注解时,就需要使用元注解来标注我们定义的注解,以标识自定义注解的一些属性信息。@Target,@Retention,@Documented,@Inherited,这四种元注解都位于java.lang.annotation包下。
@Target#
用来指定当前创建的注解作用于什么地方,如@Target({ElementType.TYPE})标识自定义注解可以作用于类、解耦或枚举类型上。注解取值范围为枚举常量ElementType的所有值,有:
ElementType.TYPE:用于类、接口或枚举声明
ElementType.FIELD:用于字段声明
ElementType.METHOD:用于方法声明
ElementType.PARAMETER:用于正式的参数声明
ElementType.CONSTRUCTOR:用于构造函数声明
ElementType.LOCAL_VARIABLE:用于局部变量声明
ElementType.ANNOTATION_TYPE:用于注解类型声明
ElementType.PACKAGE:用于包声明
@Retention#
@Retention注解代表了一个注解的生命周期,其值对应了注解会留存到什么时候,如编译阶段、运行阶段等。使用时与RetentionPolicy枚举常量配合,如@Retention({RetentionPolicy.Runtime}),所有取值有:
@Retention({RetentionPolicy.SOURCE}):表示定义注解指保存在源码级别,编译时会忽略。
@Retention({RetentionPolicy.CLASS}):表示注解将会在编译时保存在类文件中,运行时不保留。
@Retention({RetentionPolicy.Runtime}):表示注解在编译时和运行时都存在,且可以被反向读取。
@Documented#
使用@Documented注解标注的自定义注解会被添加在JavaDoc中。
@Inherited#
如果父类使用了被@Inherited注解标注的自定义注解,那么其子类会继承自定义注解。
理解了Java中元注解的代表含义,那么我们可以使用这些元注解来实现自定义注解。
引入aop依赖#
自定义注解实现逻辑时主要依靠Spring的AOP功能,首先需要引入相关依赖。
<!-- 引入aop切面支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
创建自定义注解#
创建一个自定义注解,根据需要添加元注解并指定枚举值
import java.lang.annotation.*;
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
}
实现自定义注解逻辑#
定义切面类
定义切点,并以自定义注解为切入
定义使用注解的方法需要附加的通知类型和内容
具体的注解逻辑实现代码为:
/**
* 实现注解逻辑
* @Aspect 定义切面类
* @Component 注册为容器组件
*/
@Aspect
@Component
public class TestAnnotationImpl {
//定义切点
@Pointcut("@annotation(com.example.demo1.annotation.TestAnnotation)")
private void cut(){
}
@Before("cut()")
public void before(){
System.out.println("自定义注解前置通知!");
}
@After("cut()")
public void after(){
System.out.println("自定义注解后置通知!");
}
}
使用自定义注解#
注解定义完成并将注解的具体逻辑实现后,我们就可以在controller控制层来使用我们自定一的注解了。
@RestController
public class TestController {
//使用自定义注解
@TestAnnotation
@RequestMapping("/hello")
public String hello(){
System.out.println("hello world!");
return "hello world!";
}
}
我们为方法使用了自定义注解后,访问方法地址,会发现在方法输出内容的前、后出现了自定义注解的内容,这就说明我们的注解发生了作用,为方法添加了前置通知和后置通知。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~