Spring 自定义注解 Aop切面 编程

Spring 自定义注解 Aop切面 编程

定义自己的注解
package com.wmang.ext.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author: wmang
 * @date: 2019/12/12 17:39
 * @description:
 */
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface CatCall {
    // 注解自定义属性名
    String sysId();
    String url();
}

有几个属性需要注意:

@Target注解

作用: 用来修饰当前注解可是使用的范围,直接用枚举ElementType定义,支持以下几种模式

  1. TYPE: 类,接口或者枚举
  2. METHOD: 方法
  3. PARAMETER: 参数
  4. CONSTRUCTOR: 构造方法
  5. LOCAL_VARIABLE: 局部变量
  6. ANNOTATION_TYPE: 注解类型
  7. PACKAGE: 包
@Retention

指明当前注解的生命周期,即注解到开始触发.会保持到哪个阶段
RetentionPolicy的取值有以下几种:

  1. SOURCE: 源码级别保留,编译后不再使用
  2. CLASS: 编译代码时保留,jvm运行过程中不再使用
  3. RUNTIME: 运行时保留,编译时保留,jvm运行过程保留,可以被反射方法调用
@ Documented

只做标记使用,标记为可以被javadoc文档化

@Inherited注解

标识允许子类继承父类中的注解。

使用注解的时候需要注意.在定义注解时使用的@interface,方法名对应的就是自定义属性名,返回值类型对应属性类型

使用AOP开发拦截注解定义方法

具体代码实现:

package com.wmang.ext.config;

import com.dianping.cat.Cat;
import com.dianping.cat.message.Transaction;
import com.wmang.ext.annotation.CatCall;
import feign.FeignException;
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.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;

import java.lang.reflect.Method;

/**
 * @author: wmang
 * @date: 2019/12/12 14:06
 * @description:
 */
@Aspect
@Configuration
public class FeignIntercept {

    private Logger log = LoggerFactory.getLogger(FeignIntercept.class);

	// 此处** 为实际包路径
    @Pointcut(value = "@annotation(com.wmang.ext.annotation.CatCall)")
    public void interceptPoint() {
    }

    @Around(value = "interceptPoint()")
    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("环绕通知:");
        MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
        //从切面中获取当前方法
        Method method = signature.getMethod();
        CatCall call = method.getAnnotation(CatCall.class);
        // 提取出注解属性值
        System.out.println(call.sysId());
        System.out.println(call.url());
     
        Object result = null;

        try {

            result = proceedingJoinPoint.proceed();

           
        } catch (Exception e) {
            log.error("切面逻辑处理发生异常:[{}]", e.getMessage());
            e.printStackTrace();
        }
        return result;
    }

}
  1. @Pointcut: 定义拦截规则,触发条件.此处只用写拦截规则.不用实现
  2. @Around切面:注解方法前后拦截,方法进入前后触发
  3. @Before: 前置方法拦截,方法执行前触发
  4. @After: 后置方法拦截,不管是抛出异常或者正常退出都会触发
  5. @AfterReturning: 后置方法拦截,方法执行成功后返回结果时触发
  6. @AfterThrowing:后置方法拦截,方法执行抛出异常后触发
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值