JAVA自定义注解SpringAOP

前言:Annotation(注解)是JDK5.0及以后版本引入的,它的作用就是负责注解其他注解。现在开发过程中大家都已经放弃了传统的XML配置的方式改为注解的方式,既简单又简洁,方便管理和维护。目前引用第三方jar包的注解都是解决技术上的问题,然而我们在工作中也需要通过注解解决业务上的一些问题,所以就得用到自定义注解。

1.自定义一个注解

创建一个 @interface的文件,则表示这是一个注解类

/*
 * 自定义注解
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface SecureValid {
    String desc() default "身份和安全验证开始...";
}

2.注解的属性描述

2.1 @Target

用于描述注解的使用范围(即:被描述的注解可以用在什么地方),其取值有:

ElementType.CONSTRUCTOR 用于描述构造器。 ElementType.FIELD 用于描述域。 ElementType.LOCAL_VARIABLE 用于描述局部变量 ElementType.METHOD 用于描述方法 ElementType.PACKAGE 用于描述包 ElementType.PARAMETER 用于描述参数 ElementType.TYPE 用于描述类或接口

2.2 @Retention

用于描述注解的生命周期(即:被描述的注解在什么范围内有效),其取值有: RetentionPolicy.SOURCE 在源文件中有效(即源文件保留)。 RetentionPolicy.CLASS 在 class 文件中有效(即 class 保留) RetentionPolicy.RUNTIME 在运行时有效(即运行时保留)

2.3 @Documented

在默认的情况下javadoc命令不会将我们的annotation生成再doc中去的,所以使用该标记就是告诉jdk让它也将annotation生成到doc中去

2.4 @Inherited

比如有一个类A,在他上面有一个标记annotation,那么A的子类B是否不用再次标记annotation就可以继承得到

3.Annotation属性值

有以下三种: 基本类型、数组类型、枚举类型

3.1 基本串类型

public @interface UserdefinedAnnotation {  
    intvalue();  
    String name() default "zhangsan";  
    String address();  
}
使用:
@UserdefinedAnnotation(value=123,name="wangwenjun",address="火星")  
    public static void main(String[] args) {  
        System.out.println("hello");  
    }  
}

3.2 数组

public @interface UserdefinedAnnotation {  
    int[] value();  
}  
使用:  
public class UseAnnotation {  
      
    @UserdefinedAnnotation({123})  
    public static void main(String[] args) {  
        System.out.println("hello");  
    }  
} 

3.3 枚举类型

public enum DateEnum {  
    Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday  
}  
然后在定义一个annotation  
package com.wangwenjun.annatation.userdefined;  
  
public @interface UserdefinedAnnotation {  
    DateEnum week();  
}  
使用: 
public class UseAnnotation {  
    @UserdefinedAnnotation(week=DateEnum.Sunday)  
    public static void main(String[] args) {  
        System.out.println("hello");  
    }  
}

4.使用SpringAOP来增强

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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;


@Aspect
@Component
public class Aspect {

    private static final Logger logger = LoggerFactory.getLogger(Aspect.class);

    //切入点
    @Pointcut("@annotation(注解的包路径)")
    public void pointcut() {
    }

    @Around("pointcut()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
            //获取request
            HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();  
	        //拦截的实体类
	        Object target = joinPoint.getTarget();
	        //拦截的方法名称
	        String methodName = joinPoint.getSignature().getName();
	        //拦截的方法参数
	        Object[] args = joinPoint.getArgs();
	        //拦截的放参数类型
	        Class[] parameterTypes = ((MethodSignature) joinPoint.getSignature()).getMethod().getParameterTypes();

            
             //TODO 处理业务代码

             

            //处理完之后放行
            Object[] args = joinPoint.getArgs();
            return joinPoint.proceed(args);
    }
      
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏李才哥

JavaScript面试中,高薪问题总结

7810
来自专栏NanBox

实现一个带浮动标签的输入框

现在带浮动标签的输入框也是一个很常见的东西了,在材料设计里面有一个 TextInputLayout 的控件,我们可以用它实现这个效果。但是材料设计控件的样式比较...

10510
来自专栏Jerry的SAP技术分享

避免CRM_IB 013 error message

版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)

11830
来自专栏NanBox

给 RecyclerView 加上折叠的效果

RecyclerView 有很高的自由度,可以说只有想不到没有做不到,真是越用越喜欢。这次用超简单的方法,让 RecyclerView 带上折叠的效果。

17310
来自专栏沉默王二

一名合格的程序员应该是什么样子

6 月 25 号,母亲打来电话,说妹妹的高考成绩离二本线差 9 分。我听完随口扔了一句,“在我的意料之中。”因为她平时的成绩也就在二本线上下徘徊。

7230
来自专栏李才哥

关于对象莫名其妙的面试题

5530
来自专栏编程之路的专栏

Python 编程技巧之字符串拼接

这样写不仅代码不好看,而且性能也不高。实际上,在Python中,字符串的拼接有多种实现方法,这里就一一介绍一下,并简单的测试其性能

9720
来自专栏Jerry的SAP技术分享

Advanced search view打开出错的问题

版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)

9230
来自专栏达达前端

(33)Vue购物车

static、relative、absolute、fixed、inherit、sticky

17730
来自专栏李才哥

Json对象与Json字符串互转(4种转换方式)

  $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象

1.9K40

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励