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;
@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;
}
}
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
}
}
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));
}
}
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:http://blog.itpub.net/32498/viewspace-2642313/