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]);
    }
这样自定义注解开发就结束了,需要的可以试试吧。

猜你喜欢

转载自blog.csdn.net/qq_29175301/article/details/79978753