[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!";
    }
}

我们为方法使用了自定义注解后,访问方法地址,会发现在方法输出内容的前、后出现了自定义注解的内容,这就说明我们的注解发生了作用,为方法添加了前置通知和后置通知。

作者:Esofar

出处:https://www.cnblogs.com/DCFV/p/18341025

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   Duancf  阅读(63)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示