如何通过aspect获取自定义注解的参数?
How to get parameter of custom annotation by aspect?
在我的方面方法中,我需要获取名称的值(自定义注释的参数)name = "unit test"
用户调用方法:
@Service
@RequiredArgsConstructor
@Slf4j
public class Task {
@CronLogger(name = "unit test")
public void testCronLogger(String param) {
log.info("testCronLogger ...");
}
}
自定义注释:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface CronLogger {
public String name() default "";
}
看点方法:
@Aspect
@Component
@EnableAspectJAutoProxy
public class CronLoggerAspect {
private static final Logger log = LoggerFactory.getLogger(CronLoggerAspect.class);
@Around("@annotation(CronLogger)")
public Object trace(ProceedingJoinPoint joinPoint) throws Throwable {
Object[] tab = joinPoint.getArgs();
for (Object object : tab) {
log.debug("CronLogger: {}", object);
}
return joinPoint.proceed();
}
}
控制台:
CronLogger: test
testCronLogger ...
需要获取Method并获取该方法的Annotation。
@Around("@annotation(CronLogger)")
public Object trace(ProceedingJoinPoint joinPoint) throws Throwable {
String name = MethodSignature.class.cast(joinPoint.getSignature()).getMethod().getAnnotation(CronLogger.class)
.name();
log.debug("CronLogger: {}", name);
return joinPoint.proceed();
}
这个怎么样(未经测试,我只是修改了你的代码)?
@Around("@annotation(cronLogger)")
public Object trace(ProceedingJoinPoint joinPoint, CronLogger cronLogger) throws Throwable {
log.debug("CronLogger: {}", cronLogger.name());
return joinPoint.proceed();
}
请注意大小写字符。一个是注解class名称,另一个是方法参数名称。
在我的方面方法中,我需要获取名称的值(自定义注释的参数)name = "unit test"
用户调用方法:
@Service
@RequiredArgsConstructor
@Slf4j
public class Task {
@CronLogger(name = "unit test")
public void testCronLogger(String param) {
log.info("testCronLogger ...");
}
}
自定义注释:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface CronLogger {
public String name() default "";
}
看点方法:
@Aspect
@Component
@EnableAspectJAutoProxy
public class CronLoggerAspect {
private static final Logger log = LoggerFactory.getLogger(CronLoggerAspect.class);
@Around("@annotation(CronLogger)")
public Object trace(ProceedingJoinPoint joinPoint) throws Throwable {
Object[] tab = joinPoint.getArgs();
for (Object object : tab) {
log.debug("CronLogger: {}", object);
}
return joinPoint.proceed();
}
}
控制台:
CronLogger: test
testCronLogger ...
需要获取Method并获取该方法的Annotation。
@Around("@annotation(CronLogger)")
public Object trace(ProceedingJoinPoint joinPoint) throws Throwable {
String name = MethodSignature.class.cast(joinPoint.getSignature()).getMethod().getAnnotation(CronLogger.class)
.name();
log.debug("CronLogger: {}", name);
return joinPoint.proceed();
}
这个怎么样(未经测试,我只是修改了你的代码)?
@Around("@annotation(cronLogger)")
public Object trace(ProceedingJoinPoint joinPoint, CronLogger cronLogger) throws Throwable {
log.debug("CronLogger: {}", cronLogger.name());
return joinPoint.proceed();
}
请注意大小写字符。一个是注解class名称,另一个是方法参数名称。