欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关于aop切面 注解、参数如何获取

程序员文章站 2022-06-14 23:33:23
目录aop切面 注解、参数如何获取定义需要切面的注解在需要进行切面的方法标注注解定义切面aop中获取自定义注解的属性值自定义注解用在方法上获取注解的属性值aop切面 注解、参数如何获取在工作中会经常使...

aop切面 注解、参数如何获取

在工作中会经常使用aop,这里将aop使用基本方法,获取在切点中使用的获取参数、注解做一个样例。

定义需要切面的注解

@target(elementtype.method)
@retention(retentionpolicy.runtime)
@documented
public @interface anndemo {
    string value();
    boolean isaop() default true;
}

在需要进行切面的方法标注注解

@restcontroller
@requestmapping("/order")
public class ordercontroller {
    @autowired
    private orderservice orderservice;
    @requestmapping("/all")
    @anndemo(value = "all",isaop = false)
    public list<tborder> findall() {
        list<tborder> list = orderservice.getorderlist();
        return list;
    }
    @requestmapping("/page")
    @anndemo(value = "page")
    public list<tborder> findpage(@requestparam("username") string username) {
        list<tborder> listpage = orderservice.getorderslistpage();
        return listpage;
    }
}

定义切面

在切面中获取切点注解,方法,参数的获取

@aspect
@component
public class aspectdemo {
    @pointcut(value = "execution(* com.yin.freemakeradd.controller..*(..))")
    public void excetionmethod() {}
    @pointcut(value = "execution(* com.yin.freemakeradd.controller..*(..)) && @annotation(anndemo)")
    public void excetionnote() { }
    @before("excetionmethod()")
    public void testbefore(joinpoint joinpoint) {
        system.out.println("----------------------------前置通知---");
        object[] args = joinpoint.getargs();
        for (object arg : args) {
            system.out.println(arg);
        }
    }
    @around(value = "execution(* com.yin.freemakeradd.controller..*(..)) && @annotation(anndemo)")
    public object  testbeforenote(proceedingjoinpoint joinpoint) throws throwable {
        //用的最多通知的签名
        signature signature = joinpoint.getsignature();
        methodsignature msg=(methodsignature) signature;
        object target = joinpoint.gettarget();
        //获取注解标注的方法
        method method = target.getclass().getmethod(msg.getname(), msg.getparametertypes());
        //通过方法获取注解
        anndemo annotation = method.getannotation(anndemo.class);
        object proceed;
        //获取参数
        object[] args = joinpoint.getargs();
        system.out.println(annotation.value());
        system.out.println(annotation.isaop());
        for (object arg : args) {
            system.out.println(arg);
        }
        if (objects.isnull(annotation) || !annotation.isaop()) {
            system.out.println("无需处理");
            proceed = joinpoint.proceed();
        }else {
            system.out.println("进入aop判断");
            proceed = joinpoint.proceed();
            if(proceed instanceof list){
                list proceedlst = (list) proceed;
                if(!collectionutils.isempty(proceedlst)){
                    tborder tborder = new tborder();
                    tborder.setpaymenttype("fffffffffffffffffff");
                    arraylist<tborder> tborderlst = new arraylist<>();
                    tborderlst.add(tborder);
                    return tborderlst;
                }
            }
            system.out.println(proceed);
        }
        return proceed;
    }
}

aop中获取自定义注解的属性值

自定义注解

@target(elementtype.method)
@retention(retentionpolicy.runtime)
public @interface systemlog {
 
    public string description() default "";
}

用在方法上

@responsebody
@validrequestbody
@requestmapping("/login")
@systemlog(description="登录")
public globalresponse login(@requestbody @valid user user, bindingresult bindingresult){
    ......
}

获取注解的属性值

@around("@annotation(com.xxx.xxx.xxx.systemlog)")
public object around(proceedingjoinpoint joinpoint) throws throwable{
    systemlog systemlog = ((methodsignature)joinpoint.getsignature()).getmethod().getannotation(systemlog.class);    
    ......
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。