Springboot自定义注解

Springboot自定义注解常见定义 a 定义注解 Retention 注解 功能 指明修饰的注解的生存周期 即会保留到哪个阶段 RetentionPol 的取值包含以下三种 SOURCE 源码级别保留 编译后即丢弃 CLASS 编译级别保留 编译后的 class 文件中存在 在 jvm 运行时丢弃 这是默认值 RUNTIME 运行级别保留 编译后的 class 文件中存在 在 jvm 运行时保留 可以被反射调用 Target 注解 功能 指明了修饰的这个注解的使用范围 即被描述的注解可以用在哪里 El

常见定义

a. 定义注解

  • @Retention 注解
 功能:指明修饰的注解的生存周期,即会保留到哪个阶段。 RetentionPolicy的取值包含以下三种: SOURCE:源码级别保留,编译后即丢弃。 CLASS:编译级别保留,编译后的class文件中存在,在jvm运行时丢弃,这是默认值。 RUNTIME: 运行级别保留,编译后的class文件中存在,在jvm运行时保留,可以被反射调用。 
  • @Target 注解
 功能:指明了修饰的这个注解的使用范围,即被描述的注解可以用在哪里。 ElementType的取值包含以下几种: TYPE:类,接口或者枚举 FIELD:域,包含枚举常量 METHOD:方法 PARAMETER:参数 CONSTRUCTOR:构造方法 LOCAL_VARIABLE:局部变量 ANNOTATION_TYPE:注解类型 PACKAGE:包 
  • @Documented 注解
 功能:指明修饰的注解,可以被例如javadoc此类的工具文档化,只负责标记,没有成员取值。 

b. 定义切面

  • Pointcut 是指那些方法需要被执行”AOP”,是由”Pointcut Expression”来描述的.
Pointcut可以有下列方式来定义或者通过&& || 和!的方式进行组合. args() @args() execution() this() target() @target() within() @within() @annotation 其中execution 是用的最多的,其格式为: execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?) returning type pattern,name pattern, and parameters pattern是必须的. ret-type-pattern:可以为表示任何返回值,全路径的类名等. name-pattern:指定方法名,代表所以,set,代表以set开头的所有方法. parameters pattern:指定方法参数(声明的类型),(…)代表所有参数,()代表一个参数,(*,String)代表第一个参数为任何值,第二个为String类型. 
  • 几个注解的解释

@Around 环绕切点,在进入切点前,跟切点后执行
@After 在切点后,return前执行,
@Before 在切点前执行方法,内容为指定的切点
@Aspect 将一个类定义为一个切面类






在这里插入图片描述

步骤

自定义注解主要有3步:

  1. 编写@interface接口
  2. 编写@interface对应的处理方法进行处理
  3. 调用处理方法

示例

  • pom.xml 配置
 
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0 
     modelVersion> <parent> <groupId>org.springframework.boot 
      groupId> <artifactId>spring-boot-starter-parent 
       artifactId> <version>2.6.4 
        version> <relativePath/>  
         
         parent> <groupId>com.example 
          groupId> <artifactId>qiemian 
           artifactId> <version>0.0.1-SNAPSHOT 
            version> <name>qiemian 
             name> <description>qiemian 
              description> <properties> <java.version>1.8 
               java.version>  
                properties> <dependencies> <dependency> <groupId>org.springframework.boot 
                 groupId> <artifactId>spring-boot-starter-web 
                  artifactId>  
                   dependency> <dependency> <groupId>org.springframework.boot 
                    groupId> <artifactId>spring-boot-starter-test 
                     artifactId> <scope>test 
                      scope>  
                       dependency>  
                       <dependency> <groupId>org.springframework.boot 
                        groupId> <artifactId>spring-boot-starter-aop 
                         artifactId>  
                          dependency>  
                           dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot 
                            groupId> <artifactId>spring-boot-maven-plugin 
                             artifactId>  
                              plugin>  
                               plugins>  
                                build>  
                                 project> 
  • FirstAnnotation.java
package com.example.qiemian.annotation; import java.lang.annotation.*; @Target({ 
   ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface FirstAnnotation { 
    String value() default ""; } 
  • FirstAspectj.java
package com.example.qiemian.aspectj; import com.example.qiemian.annotation.FirstAnnotation; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; import java.lang.reflect.Method; @Aspect @Component public class FirstAspectj { 
    @Pointcut("@annotation(com.example.qiemian.annotation.FirstAnnotation)") public void annotationPointcut(){ 
    System.out.println("进入切面执行"); } @Before("annotationPointcut()") public void beforePointcut(JoinPoint joinPoint){ 
    MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); Method method = methodSignature.getMethod(); FirstAnnotation annotation = method.getAnnotation(FirstAnnotation.class); String value = annotation.value(); System.out.println("准备:" + value); } @After("annotationPointcut()") public void afterPointcut(JoinPoint joinPoint){ 
    MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); Method method = methodSignature.getMethod(); FirstAnnotation annotation = method.getAnnotation(FirstAnnotation.class); String value = annotation.value(); System.out.println("结束:" + value); } } 
  • TestController.java
package com.example.qiemian.controller; import com.example.qiemian.service.TestService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/test") public class TestController { 
    @Autowired TestService testService; @GetMapping() public String test(){ 
    testService.doSomething(); return "hello annotation"; } } 
  • TestService.java
package com.example.qiemian.service; public interface TestService { 
    public void doSomething(); } 
  • TestServiceImpl
package com.example.qiemian.service.impl; import com.example.qiemian.annotation.FirstAnnotation; import com.example.qiemian.service.TestService; import org.springframework.stereotype.Service; @Service public class TestServiceImpl implements TestService { 
    @FirstAnnotation("吃饭") @Override public void doSomething() { 
    System.out.println("impl:吃饭啦啦啦"); } } 
  • QiemianApplication
package com.example.qiemian; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class QiemianApplication { 
    public static void main(String[] args) { 
    SpringApplication.run(QiemianApplication.class, args); } } 

运行效果

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208674.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午11:02
下一篇 2026年3月19日 上午11:02


相关推荐

  • matlab 马赫带效应,matlab图像处理基础实例

    matlab 马赫带效应,matlab图像处理基础实例matlab图像处理基础实例·边缘检测(edge)边缘检测时先要把其他格式图像转化为灰度图像>>f=imread(lbxx.bmp);>>a=rgb2gray(f);>>[g,t]=edge(a,canny);>>imshow(g)·剪贴(imcrop)、subplot等imfinfocolormapsubimageimadd…

    2025年6月28日
    6
  • G1 收集器介绍「建议收藏」

    G1 收集器介绍「建议收藏」G1收集器一.名词解释MetaSpace在Java8之后取代永久代方法区的内存部分,NativeMemoryMixedGCEvent所有YoungRegion和一部分OldRegion的混合GC时间。ReclaimableG1为了能够回收,创建了一系列专门用于对象回收的Region,存放在链表中,只包含存活率小于-XX:G1MixedGCLIveThr…

    2022年6月7日
    51
  • 网络传真机,开启无纸化进程

    网络传真机,开启无纸化进程网络传真机,离你不再遥远!网络传真-真实号码版,超低价来袭,江苏电信倾力投资,立足江苏,面向全国!13万靓号任君选择。(1)传真发送功能点击写传真可进行单个号码发送传真也可多个号码发送(目前单次80个号码上限);传真群发操作:步骤1:输入发送的个号码,多个号码中间用逗号隔开;也可选择地址导入与文本导入方式导入需要发送的号码。步骤2:输入发送主题;步骤3:点击浏览上传要发送的传…

    2022年6月28日
    31
  • 八个Android项目源码

    八个Android项目源码给大家分享几个Android开发项目源码,大部分功能相信可以在实战项目中直接使用,供大家下载学习,大部分项目是基于AndroidStudio开发,IDE为Eclipse的童鞋可通过网上教程自行转换,这里就不多说了。有句话说,不贴墙纸的装修都是耍流氓,无源码无效果图的文章也算是耍流氓,尴尬,那就直接上图吧。最近在整理GitHub,打算把一些以前做过的项目中部分功能和使用的技术点资料上传,回头也和大家分享。OK,要去忙了,再不去忙项目,测试版出不来就危险了,希望有一天不用敲代码也可以吃到馒头,吼吼~~

    2022年6月6日
    36
  • 夸克A眼镜沉浸观影设置教程

    夸克A眼镜沉浸观影设置教程

    2026年3月15日
    2
  • 微信第三方开发者答网友问 微信创业靠谱吗

    微信第三方开发者答网友问 微信创业靠谱吗一、基础常识1、所谓的第三方开发,就是腾讯公众平台内开放的开发者模式。用户可以根据个人不同的需求开发不同的功能。2、开发模式后,有两个需要我们去填写的东西:一个是ur,一个是token;简单的解释一下就是:url地址,第三方平台的地址;token是通往地址的接口。3、第三方的开发什么?就是一些功能模块。第三方是一个平台,微信公众平台管理也是一个平台。而url就是一个一条链接

    2022年6月1日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号