Łuk*_*cki 5 java aop spring aspectj
如何读取方面中的注释属性值?
我希望对所有使用@Transactional注释的关节点执行我的Around建议(readonly = false).
@Around("execution(* com.mycompany.services.*.*(..)) "
+ "&& @annotation(org.springframework.transaction.annotation.Transactional)")
public Object myMethod(ProceedingJoinPoint pjp) throws Throwable {
}
Run Code Online (Sandbox Code Playgroud)
你可以不用手动处理签名,这种方式(argNames用于在没有调试信息的情况下编译时保留参数名称):
@Around(
value = "execution(* com.mycompany.services.*.*(..)) && @annotation(tx)",
argNames = "tx")
public Object myMethod(ProceedingJoinPoint pjp, Transactional tx)
throws Throwable {
...
}
Run Code Online (Sandbox Code Playgroud)
你可以这样做:
注解:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Profiled {
public boolean showArguments();
}
Run Code Online (Sandbox Code Playgroud)
拦截器:
@Aspect
public class ProfilingAspect {
public static Logger log = LoggerFactory.getLogger("ProfilingAspect");
@Around("@annotation(profiled)")
public Object profiled(final ProceedingJoinPoint pjp,
final Profiled profiled) throws Throwable {
StopWatch sw = new StopWatch();
try {
sw.start();
return pjp.proceed();
} finally {
sw.stop();
StringBuilder sb = new StringBuilder();
sb.append("Method ");
sb.append(pjp.getSignature().getName());
if (profiled.showArguments()) {
sb.append(" with arguments ");
sb.append(Arrays.toString(pjp.getArgs()));
}
sb.append(" took ");
sb.append(sw.getTime());
sb.append(" millis");
log.info(sb.toString());
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4572 次 |
| 最近记录: |