返回顶部
首页 > 资讯 > 精选 >Transmit Value by Customized Annotation in AOP Interception
  • 436
分享到

Transmit Value by Customized Annotation in AOP Interception

2023-06-05 05:06:05 436人浏览 独家记忆
摘要

1  Mydoing.javapackage sh.fudan.cxiao.MyAnno.annotation;import java.lang.annotation.ElementType;import&nb

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.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;@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

Transmit Value by Customized Annotation in AOP Interception

--结束END--

本文标题: Transmit Value by Customized Annotation in AOP Interception

本文链接: https://lsjlt.com/news/241301.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作