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; @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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/32498/viewspace-2642313/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Spring中通過Annotation來實現AOPSpring
- Entity Framework 6.0 Tutorials(5):Command InterceptionFramework
- Annotation
- java annotationJava
- Java自定義Annotation,通過反射解析AnnotationJava反射
- Transmit教程|如何將Transmit傳輸到新的Mac並匯入資料MITMac
- Transmit 5 for MacFTP客戶端MITMacFTP客戶端
- Java建立AnnotationJava
- 自定義Annotation
- JUnit basic annotation
- java 的annotationJava
- customized English word breaker for sql server 2008ZedSQLServer
- MacFTP客戶端——Transmit 5 for MacMacFTP客戶端MIT
- Transmit 5 for Mac(FTP客戶端)MITMacFTP客戶端
- Java —— 註解(Annotation)Java
- java反射——反射AnnotationJava反射
- Java Annotation 註解Java
- Annotation for ANDROID ---FirstAndroid
- Java 註解(Annotation)Java
- mark mybatis annotation drivenMyBatis
- JAVA ANNOTATION詳解Java
- java-Annotation註解Java
- Java之註解(Annotation)Java
- Java 註解Annotation研究Java
- ch11_enum_and_annotation
- Transmit:mac檔案傳輸的高效工具MITMac
- Clone Madison 12R TEST application with customized data file locationAPPZed
- Spring常用Annotation簡介Spring
- Java註解(Annotation)詳解Java
- JAVA(五)反射機制/AnnotationJava反射
- 【Java.Core】註解 - AnnotationJava
- JUnit 4中annotation的用法
- Transmit for mac(FTP/SFTP客戶端)中文版MITMacFTP客戶端
- Transmit 5中文最新資源5.10.4MIT
- FTP/SFTP客戶端:Transmit Mac中文版FTP客戶端MITMac
- AOP
- LOW_VALUE、HIGH_VALUE、ENDPOINT_VALUE轉換--UTL_RAW、DBMS_STATS.CONVERT_RAW_VALUE
- Ping:Transmit Failed, Error Code 65問題解決MITAIError