中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Transmit Value by Customized Annotation in AOP Interception

發布時間:2020-08-16 16:49:20 來源:ITPUB博客 閱讀:109 作者:eurt 欄目:軟件技術

1  Mydoing.java

package sh.fudan.cxiao.MyAnno.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Mydoing {
    String name();
}


2  MyService.java

package sh.fudan.cxiao.MyAnno.business;
import org.springframework.stereotype.Component;
import sh.fudan.cxiao.MyAnno.annotation.Mydoing;
@Component
public class MyService {
    
    @Mydoing (name="#n")
    public int doSomething(int n) {
        System.out.println("Executing pointcut function, i.e. business operation");
        return 100*n;
    }
}


3  SupportingComponent.java

package sh.fudan.cxiao.MyAnno.component;
import java.lang.reflect.Method;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.DefaultParameterNameDiscoverer;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.stereotype.Component;
import sh.fudan.cxiao.MyAnno.annotation.Mydoing;
@Component
@Aspect
public class SupportingComponent {
    
    @Around("@annotation(sh.fudan.cxiao.MyAnno.annotation.Mydoing)")
    public Object doExtraThingForMydoingAnno(ProceedingJoinPoint joinPoint) throws Throwable{
        
        System.out.print("before pointcut execution, get details of the annotation item 'name' on pointcut");
        String  nameEL = "";
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = joinPoint.getTarget().getClass().getMethod(signature.getName(), signature.getMethod().getParameterTypes());
        Mydoing mydoing = method.getAnnotation(Mydoing.class);
        nameEL = mydoing.name(); // i.e. #n
        System.out.println(" = " + nameEL);
        
        System.out.print(nameEL + "'s value comes from the parameter with the same name on pointcut");
        
        // 1. create parser
        ExpressionParser parser = new SpelExpressionParser();
        Expression expression = parser.parseExpression(nameEL);
        
        // 2. set up evaluation context
        EvaluationContext context = new StandardEvaluationContext();  
        
        Object[] args = joinPoint.getArgs(); //the running time arguments value on pointcut 
        DefaultParameterNameDiscoverer discoverer = new DefaultParameterNameDiscoverer();
        String[] parameterNames = discoverer.getParameterNames(method); //parameter names on pointcut
        // put the parameter name on pointcut and relevant running argument value  into context
        for(int i = 0; i < parameterNames.length; i++) { 
            context.setVariable(parameterNames[i], args[i]);
        }
        
        // 3. parsing (To get the value of placeholder in annotation on pointcut)
        // get the value of the running time argument whose name is same as details of the annotation item 'name' on pointcut, i.e. #n
        Integer In = (Integer)expression.getValue(context);   
        System.out.println(", value is " + In);
        
        int base = 1000;
        if (In%2==0) base=2000;
        
        if (In==0) // Do not execute pointcut when the argument equals zero 
            return -1;
        
        Integer result = (Integer)joinPoint.proceed();  // execute the pointcut
        
        System.out.println("after pointcut execution, subsequently process the returned value from pointcut.");
        result += base + In;
        
        return result;  // the returned value should be compatible with the returned type from pointcut
    }
}


4  MyAnnoApplication.java

package sh.fudan.cxiao.MyAnno;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import sh.fudan.cxiao.MyAnno.business.MyService;
@SpringBootApplication
public class MyAnnoApplication {
    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(MyAnnoApplication.class);
        MyService myService = ctx.getBean(MyService.class);
        System.out.println("The result is " + myService.doSomething(5));
        System.out.println("The result is " + myService.doSomething(6));
        System.out.println("The result is " + myService.doSomething(0));
    }
}


5  the snapshot of running

Transmit Value by Customized Annotation in AOP Interception

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

略阳县| 西峡县| 淳化县| 昭苏县| 平谷区| 富源县| 闽侯县| 西和县| 宁化县| 甘肃省| 濮阳市| 镇安县| 游戏| 苏尼特左旗| 上犹县| 白玉县| 墨竹工卡县| 新巴尔虎左旗| 剑川县| 财经| 特克斯县| 墨玉县| 桑日县| 那曲县| 井冈山市| 通化市| 房山区| 汕头市| 商河县| 龙游县| 正宁县| 分宜县| 康马县| 北安市| 周至县| 岳西县| 横山县| 海安县| 兴业县| 黔西| 延寿县|