1 Mydoing.javapackage sh.fudan.cxiao.MyAnno.annotation;import java.lang.annotation.ElementType;import&nb
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();}
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; }}
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.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 }}
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)); }}
--结束END--
本文标题: Transmit Value by Customized Annotation in AOP Interception
本文链接: https://lsjlt.com/news/241301.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0