một khía cạnh ngoại lệ có thể trông giống như sau:
conf
@Aspect
public class ExceptionAspect {
private static final Logger log = LoggerFactory.getLogger(ExceptionAspect.class);
public Object handle(ProceedingJoinPoint pjp) throws Throwable {
try {
return pjp.proceed();
} catch (Throwable t) {
// so something with t: log, wrap, return default, ...
log.warn("invocation of " + pjp.getSignature().toLongString() + " failed", t);
// I hate logging and re-raising, but let's do it for the sake of this example
throw t;
}
}
}
mùa xuân:
<!-- log exceptions for any method call to any object in a package called 'svc' -->
<bean class="org.example.aspects.ExceptionAspect" name="exceptionAspect" />
<aop:config>
<aop:aspect ref="exceptionAspect">
<aop:around method="handle" pointcut="execution(* org.example..svc..*.*(..))" />
</aop:aspect>
</aop:config>
EDIT:
nếu bạn muốn logger để đăng nhập trên danh nghĩa của đậu bọc, bạn có thể tất nhiên làm:
LoggerFactory.getLogger(pjp.getTarget().getClass()).warn("damn!");
hoặc nếu bạn đặt trước lớp khai báo của phương thức này chứ không phải loại thực tế (có khả năng được tạo sẵn/được tạo tự động):
LoggerFactory.getLogger(pjp.getSignature().getDeclaringType()).warn("damn!");
Thành thật mà nói, tôi không thể ước tính hiệu quả của việc gọi LoggerFactory.getLogger (..) mỗi lần. Tôi cho rằng nó không quá tệ, vì ngoại lệ là ngoại lệ (ví dụ hiếm).
Điều này sẽ đạt được điều gì mà bạn chưa có từ dấu vết ngăn xếp? Nếu bạn có kế hoạch đăng nhập và nuốt các ngoại lệ thông qua các khía cạnh, mà âm thanh như một ý tưởng khá xấu với tôi. –