Spring: Aop before after Return after Throwing around 의 원리
여기 서 before, after, after Return, after Throwing, around 가 어떻게 실행 되 는 지 코드 로 보 여 드 리 겠 습 니 다.
Around 를 사용 하지 않 을 때 실현 은 다음 과 같이 이해 할 수 있 습 니 다.
public class XxxProxy implement InvocationHandler {
private Target target;
private Interceptor interceptor;
public Object invoke(Object proxy, Method method, Object[] args) throws Exception{
interceptor.before();
boolean hasReturnValue = method.getReturnType!=void.class;
try{
Object result = null;
if(hasReturnValue){
result = method.invoke(target, args);
}else{
method.invoke(target, args);
}
interceptor.afterReturn();
return result;
}catch(Exception ex){
interceptor.afterThrowing();
throw ex;
}finally{
interceptor.after();
}
}
}
Around 를 사용 할 때 이렇게 이해 할 수 있 습 니 다.
public class XxxProxy implement InvocationHandler {
private Target target;
private Interceptor interceptor;
public Object invoke(Object proxy, Method method, Object[] args) throws Exception{
interceptor.before();
boolean hasReturnValue = method.getReturnType!=void.class;
try{
ProxyMethodInvocation methodInvocation = new ReflectiveMethodInvocation(proxy, method, target, args);
ProceedingJoinPoint proceed = new MethodInvocationProceedingJoinPoint(target, parameters);
Object result = null;
// Around
if(hasReturnValue){
result = interceptor.around(proceed); // around proceed.procced();
}else{
interceptor.around(proceed);
}
interceptor.afterReturn();
return result;
}catch(Exception ex){
interceptor.afterThrowing();
throw ex;
}finally{
interceptor.after();
}
}
}
public class ReflectiveMethodInvocation implements ProxyMethodInvocation {
private Object proxy;
private Object target;
private Method method;
private Object[] args;
public ReflectiveMethodInvocation(Object proxy, Method method, Object target, Object[] args){
this.proxy = proxy;
this.method = method;
this.target = target;
this.args = args;
}
public Method getMethod(){
return this.method;
}
public Object[] getArgs(){
return args;
}
public Object[] getTarget(){
return target;
}
}
public class MethodInvocationProceedingJoinPoint implements ProceedingJoinPoint{
private ProxyMethodInvocation methodInvocation;
public MethodInvocationProceedingJoinPoint(ProxyMethodInvocation methodInvocation){
this.methodInvocation = methodInvocation;
}
public Object procced(){
Object target = methodInvocation.getTarget();
Object[] args = methodInvocation.getArgs();
Method method = methodInvocation.getMethod();
return method.invoke(target, args);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.