千家信息网

Transmit Value by Customized Annotation in AOP Interception

发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,1 Mydoing.javapackage sh.fudan.cxiao.MyAnno.annotation;import java.lang.annotation.ElementType;impor
千家信息网最后更新 2024年11月23日Transmit Value by Customized Annotation in AOP Interception

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;@Componentpublic 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@Aspectpublic 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.parse_Expression(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;@SpringBootApplicationpublic 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

0