zoukankan      html  css  js  c++  java
  • SpringBoot自定义注解——通过AOP编程实现注解的业务逻辑功能

    SpringBoot自定义注解——通过AOP编程实现注解的业务逻辑功能

     

    (1)首先我们可以通过@interface来定义一个注解:

    import static java.lang.annotation.ElementType.METHOD;
    import static java.lang.annotation.RetentionPolicy.RUNTIME;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.Inherited;
    import java.lang.annotation.Retention;
    import java.lang.annotation.Target;
    
    
    @Inherited
    //@Documented
    @Retention(RUNTIME)
    @Target(METHOD)
    public @interface TestAnnotation {
         
    	
    	/**
    	 * 业务名称
    	 * @return
    	 */
    	String value() default "";
    }
    

           此时可能需要读者先去了解元注解的概念,元注解主要有以下几个:

    ① @Retention:用于指明修饰的注解的生命周期,即会保留到哪个阶段;

           该注解的参数主要是RetentionPolicy类型数据,它的取值有:

    SOURCE:源码级别保留,编译后即丢弃。
    CLASS:编译级别保留,编译后的class文件中存在,在jvm运行时丢弃,这是默认值。
    RUNTIME:运行级别保留,编译后的class文件中存在,在jvm运行时保留,可以被反射调用
    

           该注解的参数格式为:

    @Retention(RetentionPolicy.RUNTIME)
    
    ② @Target :用于定义注解的作用范围,如果没有该注解,则自定义注解可以作用在任何地方;

           该注解的参数主要是ElementType枚举类型数据,它的取值有:

    TYPE:类,接口或者枚举
    FIELD:域,包含枚举常量
    METHOD:方法
    PARAMETER:参数
    CONSTRUCTOR:构造方法
    LOCAL_VARIABLE:局部变量
    ANNOTATION_TYPE:注解类型
    PACKAGE:包
    

           其中该注解分为单个参数和多个参数两种形式:

    1)单个参数 
    //如果导入的是import java.lang.annotation.ElementType;
    @Target(ElementType.TYPE)
    
    //如果导入的是import java.lang.annotation.ElementType.TYPE;
    @Target(TYPE)
    
    (2)多个参数
    @Retention(value = {
         ElementType.TYPE,ElementType.METHOD,.....})
    
    ③ @Inherited:

           该注解用于标注一个父类的注解是否可以被子类继承,如果一个注解需要被其子类所继承,则在声明时直接使用@Inherited注解即可。如果没有写此注解,则无法被子类继承。

    ④ @Documented:

           该注解表明当前注解应该被 javadoc工具记录。 默认情况下,javadoc是不包括注解的。 但如果声明注解时指定了 @Documented,则它会被 javadoc 之类的工具处理,所以注解类型信息也会被包括在生成的文档中,是一个标记注解,没有成员。

    (2)为了实现注解的功能,我们可以定义一个切面testAspect,其代码如下:

    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Pointcut;
    import org.springframework.stereotype.Component;
    
    
    @Aspect  //标注增强处理类(切面类)
    @Component //交由Spring容器管理
    public class TestAspect {
         
    	
    	/*
    	 * 切入点,即我们所定义的注解类路径
    	 * */
    	@Pointcut("@annotation(com.cicoding.annotation.TestAnnotation)")
        public void testCut() {
         
    
        }
    
    	/*
    	 * 方法环绕,增强谋个方法的业务逻辑功能,该注解的参数是填写切入点所作用的方法名称
    	 * 在创建环绕通知的时候,point这个参数是必须写的。因为需要在通知中使用ProceedingJoinPoint.proceed()方法调用被通知的方法。
    	 * 另外,如果忘记调用proceed()方法,那么通知实际上会阻塞对被通知方法的调用。
    	 * 阻塞的意思就是当前注解的方法不会往下执行,只执行到此处。
    	 * */
        @Around("testCut()")
        public Object test(ProceedingJoinPoint point) throws Throwable {
         
        	// 执行方法
            Object result = point.proceed();
        	System.out.println("已经执行该方法");
        	return result;
        }
    }
    

           最后我们只需要在controller层的方法中加上这个注解,然后再执行这个方法即可,如下图所示:
    SpringBoot自定义注解——通过AOP编程实现注解的业务逻辑功能_第1张图片
           当程序执行到此处时,就会执行该注解所实现的功能,该案例主要应用的方面有登录日志的记录,用户操作等。

    地址:https://www.it610.com/article/1304675483471876096.htm

    此博客只是为了记忆相关知识点,大部分为网络上的文章,在此向各个文章的作者表示感谢!
  • 相关阅读:
    阿里P8架构师谈:阿里双11秒杀系统如何设计?
    秒杀系统设计的知识点
    秒杀系统架构优化思路
    秒杀系统解决方案
    Entity Framework Code First (七)空间数据类型 Spatial Data Types
    Entity Framework Code First (六)存储过程
    Entity Framework Code First (五)Fluent API
    Entity Framework Code First (四)Fluent API
    Entity Framework Code First (三)Data Annotations
    Entity Framework Code First (二)Custom Conventions
  • 原文地址:https://www.cnblogs.com/mark5/p/15533577.html
Copyright © 2011-2022 走看看