一种用注释指示方法 initiated/fail/success 的方法
A way to indicate method initiated/fail/success with annotations
在 Java/Spring 中有没有办法通过注释来实现以下目标?
比如我有一个方法:
public void deleteObject(Object object) {
delete(object);
}
我想发送 2 个审计事件:一个是方法启动时,另一个是方法成功完成或抛出异常时。
其实我可以这样做:
public void deleteObject(Object object) {
sendAuditEvent("Started deletion of object");
try {
delete(object);
sendAuditEvent("Finished deleting of object successfully");
} catch (Exception ex) {
sendAuditEvent("Finished deleting object with exception");
throw ex;
}
}
但是我想知道有没有办法用注释来做?我更愿意单独保留审计逻辑,而不是自动装配任何 bean 来发送审计事件。
我唯一想到的就是做这样的事情:
public void deleteObject(Object object) {
startedDeleting(object);
delete(object);
}
@SomeAnnotationOnStartOfMethod
public void startedDeleting(Object object) {
//do nothing
}
public void delete(Object object) {
try {
businessLogicMethodToDelete(object);
methodOnSuccess(object);
} catch (Exception ex) {
methodOnException(object);
throw ex;
}
}
@SomeAnnotationOnSuccess
public void methodOnSuccess(Object object) {
//do nothing
}
@SomeAnnotationOnFailure
public void methodOnException(Object object) {
//do nothing
}
但这对我来说不太好。
什么是更好的设计解决方案?
您要找的是Aspect-oriented programming。
解决此类问题最常用的工具是:
- AspectJ (cf. also the tutorial on Baeldung),
- Spring AOP (cf. also the tutorial on Baeldung)
在 Java/Spring 中有没有办法通过注释来实现以下目标?
比如我有一个方法:
public void deleteObject(Object object) {
delete(object);
}
我想发送 2 个审计事件:一个是方法启动时,另一个是方法成功完成或抛出异常时。
其实我可以这样做:
public void deleteObject(Object object) {
sendAuditEvent("Started deletion of object");
try {
delete(object);
sendAuditEvent("Finished deleting of object successfully");
} catch (Exception ex) {
sendAuditEvent("Finished deleting object with exception");
throw ex;
}
}
但是我想知道有没有办法用注释来做?我更愿意单独保留审计逻辑,而不是自动装配任何 bean 来发送审计事件。
我唯一想到的就是做这样的事情:
public void deleteObject(Object object) {
startedDeleting(object);
delete(object);
}
@SomeAnnotationOnStartOfMethod
public void startedDeleting(Object object) {
//do nothing
}
public void delete(Object object) {
try {
businessLogicMethodToDelete(object);
methodOnSuccess(object);
} catch (Exception ex) {
methodOnException(object);
throw ex;
}
}
@SomeAnnotationOnSuccess
public void methodOnSuccess(Object object) {
//do nothing
}
@SomeAnnotationOnFailure
public void methodOnException(Object object) {
//do nothing
}
但这对我来说不太好。
什么是更好的设计解决方案?
您要找的是Aspect-oriented programming。
解决此类问题最常用的工具是:
- AspectJ (cf. also the tutorial on Baeldung),
- Spring AOP (cf. also the tutorial on Baeldung)