前言:Annotation(注解)是JDK5.0及之后版本引入的,它的做用就是负责注解其余注解。如今开发过程当中你们都已经放弃了传统的XML配置的方式改成注解的方式,既简单又简洁,方便管理和维护。目前引用第三方jar包的注解都是解决技术上的问题,然而咱们在工做中也须要经过注解解决业务上的一些问题,因此就得用到自定义注解。java
建立一个 @interface的文件,则表示这是一个注解类web
/* * 自定义注解 */ @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited public @interface SecureValid { String desc() default "身份和安全验证开始..."; }
用于描述注解的使用范围(即:被描述的注解能够用在什么地方),其取值有:spring
ElementType.CONSTRUCTOR 用于描述构造器。
ElementType.FIELD 用于描述域。
ElementType.LOCAL_VARIABLE 用于描述局部变量
ElementType.METHOD 用于描述方法
ElementType.PACKAGE 用于描述包
ElementType.PARAMETER 用于描述参数
ElementType.TYPE 用于描述类或接口数组
用于描述注解的生命周期(即:被描述的注解在什么范围内有效),其取值有:
RetentionPolicy.SOURCE 在源文件中有效(即源文件保留)。
RetentionPolicy.CLASS 在 class 文件中有效(即 class 保留)
RetentionPolicy.RUNTIME 在运行时有效(即运行时保留)安全
在默认的状况下javadoc命令不会将咱们的annotation生成再doc中去的,因此使用该标记就是告诉jdk让它也将annotation生成到doc中去spa
好比有一个类A,在他上面有一个标记annotation,那么A的子类B是否不用再次标记annotation就能够继承获得.net
有如下三种: 基本类型、数组类型、枚举类型code
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"); } }
public @interface UserdefinedAnnotation { int[] value(); } 使用: public class UseAnnotation { @UserdefinedAnnotation({123}) public static void main(String[] args) { System.out.println("hello"); } }
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"); } }
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); } }