SpringBoot自定义注解

创建一个springboot项目

在这里插入图片描述

下一步然后直接finish即可。

引入aop的依赖,通过aop实现自定义注解(不需要指定版本,spring-boot-starter的包会自动匹配版本)

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

创建一个注解类

创建类的时候选择@Annotation
在这里插入图片描述

创建完成之后,在类上按一下@就会有你写的这个注解

package com.example.customannotation.common;

import java.lang.annotation.*;

/**
 * @desc: 自定义注解
 * @author: LiuChang
 * @since: 2021/8/31
 *
 * @Documented  注解信息会被添加到Java文档中
 * @Target(ElementType.XXX) 指定注解修饰的范围、类型
 * @Retention(RetentionPolicy.XXX) 被注解的注解需要保留多久
 * @Inherited – 是否允许子类继承该注解
 */

@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnno {
	//ElementType.METHOD 这里是对使用此注解的方法进行aop切面处理
    
    //注解中定义的内容
    
}

解释一下具体的参数的意义:

@Target(ElementType.TYPE) //接口、类、枚举、注解
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR) //构造函数
@Target(ElementType.LOCAL_VARIABLE)//局部变量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) ///包
@Retention(RetentionPolicy.SOURCE) —— 这种类型的Annotations只在源代码级别保留,编译时就会被忽略
@Retention(RetentionPolicy.CLASS) —— 这种类型的Annotations编译时被保留,在class文件中存在,但JVM将会忽略
@Retention(RetentionPolicy.RUNTIME) —— 这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用.

创建一个aop,定义切点

针对加了自定义注解的方法进行一些操作,操作主要包括:调用方法前-调用方法后-方法出现异常-方法正常返回等

package com.example.customannotation.common;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @desc: 自定义注解的aop
 * @author: LiuChang
 * @since: 2021/8/31  
 * @Aspect 一定要有!!!
 */
@Aspect
@Component
public class CustomAspect {
    //@Pointcut 需要定义切点的位置  @annotation(xxx) 获取自定义注解对象
    //声明一个切点,切点就是我们自定义注解类的位置
    @Pointcut("@annotation(com.example.customannotation.common.CustomAnno)")
    private void customAnno(){
        System.out.println("point Cut");
    }

    /**
     * 一个环绕通知
     * @Around()
     */
    @Around("customAnno()")
    public void advice(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
        System.out.println("Around Begin");
        proceedingJoinPoint.proceed();//执行到这里开始走进来的方法体(必须声明)
        System.out.println("Around End");
    }

    //当想获得注解里面的属性,可以直接注入改注解
    //方法可以带参数,可以同时设置多个方法用&&   @Before 切点执行前
    @Before("customAnno()")
    public void record(JoinPoint joinPoint) {
        System.out.println("Before");
    }
	// @After切点执行后的操作
    @After("customAnno()")
    public void after() {
        System.out.println("After");
    }


}

@Before, 前置通知,方法前执行
@Around, 环绕增强,目标方法所执行前后所执行的一些代码
@AfterReturning, 处理完请求,返回的内容
@AfterThrowing, 目标方法抛出异常后执行
@After 后置通知,方法后执行

自定义注解测试

创建一个controller,测试我们的自定义注解是否生效,使用@RestController需要添加web依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
package com.example.customannotation.common;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @desc: 测试自定义注解是否生效
 * @author: LiuChang
 * @since: 2021/8/31
 */
@RestController
public class TestController {

    @CustomAnno
    @RequestMapping("/test")
    public void getLog(){
        System.out.println("调用自定义注解");
    }
}

然后使用postman进行访问测试
在这里插入图片描述

IDEA 控制台打印的结果:

Around Begin
Before
调用自定义注解
After
Around End

主要就是围绕所被注解的方法进行额外操作。

微信公众号:FluencyHome (程序员部落) 同步更新,欢迎关注,方便随时查看文章。

SpringBoot中可以自定义注解来实现特定的功能。自定义注解的步骤如下: 1. 使用`@interface`关键字来定义注解,可以在注解中设置属性。 2. 可以通过注解的属性来传递参数,比如设置注解中的属性值。 3. 可以通过判断某个类是否有特定注解来进行相应的操作。 在SpringBoot中,自定义注解可以用于实现日志记录、定时器等功能。通过使用注解,可以简化代码,并提高开发效率。同时,自定义注解也是Spring框架中广泛应用的一种方式,可以在SpringMVC框架中使用注解来配置各种功能。而在SpringBoot框架中,更是将注解的使用推向了极致,几乎将传统的XML配置都替换为了注解。因此,对于SpringBoot来说,自定义注解是非常重要的一部分。123 #### 引用[.reference_title] - *1* *3* [springboot 自定义注解(含源码)](https://blog.csdn.net/yb546822612/article/details/88116654)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *2* [SpringBoot-自定义注解](https://blog.csdn.net/weixin_44809337/article/details/124366325)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值