springboot aop配置,并使用自定义注解annotation
我在项目中使用自定义注解的需求有2:
A.我需要切一个包下所有类,@Pointcut("execution(public * com.jhsec.ifc.inr.api..*.*(..))")这样比较方便。
B.如果这样写的话因为我调用多次这包下的其它类,就会创建多个代理对象,就会走多次环绕方法,所以需要自定义注解。
具体如下:
1.首先建立自定义注解类,如下
这是目录结构。
2.下面是LogAnnotation注解类具体内容:
@Documented//说明该注解将被包含在javadoc中 //@Retention: 定义注解的保留策略, @Retention(RUNTIME)// 注解会在class字节码文件中存在,在运行时可以通过反射获取到 //@Target:定义注解的作用目标 @Target({METHOD,PARAMETER})// 方法和方法参数 @Inherited//说明子类可以继承父类中的该注解 public @interface LogAnnotation { /** * 如果注解只有一个属性,那么肯定是赋值给该属性。 * 如果注解有多个属性,而且前提是这多个属性都有默认值,那么你不写注解名赋值,会赋值给名字为“value”这属性。 * 如果注解有多个属性,其中有没有设置默认值的属性,那么当你不写属性名进行赋值的时候,是会报错的。 */ //@AliasFor("")起别名 int value() default 000; }
3.在需要作为切点的类方法上添加自定义注解,如下红框区:
4.在切面类中提加内容,具体如下:
红色框中为自定义注解引用,绿色框框中的内容去掉或留着我测试时没有影响,我还不知道他的作用是什么所以先留着。
doAround方法具体代码如下:
@Around(value = "LogAnnotation() && webLog() && @annotation(logAnnotation)")//环绕切点,在进入切点前,跟切点后执行 public Object doAround(ProceedingJoinPoint pjp, LogAnnotation logAnnotation)throws Throwable { Object result = null; // System.out.println("环绕。。。。。。1"+logAnnotation.value()); //接收到请求,记录请求内容 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); // 记录下请求内容 logger.info("URI : " + request.getRequestURI()); logger.info("URL : " + request.getRequestURL()); logger.info("HTTP_METHOD : " + request.getMethod()); logger.info("IP : " + request.getRemoteAddr()); logger.info("CLASS_METHOD : " + pjp.getSignature().getDeclaringTypeName() + "_" + pjp.getSignature().getName()); logger.info("ARGS : " + Arrays.toString(pjp.getArgs())); System.out.println("ARGS对象:" + pjp.getArgs()[0]); }这样自定义注解开发就结束了,需要的可以试试吧。