第一步:配置实现MethodInterceptor的切面
public class OutsideInvokeLogInterceptor implements MethodInterceptor{
private static Logger log = Logger.getLogger("outsideInvoke");
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
String methodName = invocation.getMethod().toString();
Object returnValue = invocation.proceed();
if (returnValue == null) {
log.warn("调用 " + methodName + "is fail,返回的result结果为空,方法入参为:(" + parseArguments(invocation.getArguments()) + ")");
return ResultDTO.getFailureResult(BSErrorCode.INTERNAL_ERROR, BaseKeyMsgCode.RETURN_RESULTDTO_IS_NULL);
}else{
if(returnValue instanceof ResultDTO){
ResultDTO<Object> resultDTO = (ResultDTO<Object>)returnValue;
if(!resultDTO.isSuccess()){
log.warn("调用 " + methodName + " is fail ,方法入参为:(" + parseArguments(invocation.getArguments()) + ")"
+ "返回值:" +resultDTO.getCode() + "," + resultDTO.getKey());
} else{
log.info("调用 " + methodName + " is success ,方法入参为:(" + parseArguments(invocation.getArguments()) + ")");
}
}
}
return returnValue;
}
}
<bean id="outsideInvokeLogAdvice" class="com.ali.luna.commons.service.interceptor.OutsideInvokeLogInterceptor" />
第二步:配置切点
<bean id="methodPointcut" class="org.springframework.aop.support.NameMatchMethodPointcut"> <property name="mappedNames"> <list> <value>add*</value> </list> </property> </bean>
第三步:配置自动代理
<bean id="outsideInvokeLogInterceptor" class="org.springframework.aop.support.DefaultPointcutAdvisor"> <property name="pointcut" ref="methodPointcut"/> <property name="advice" ref="outsideInvokeLogAdvice"/> </bean> <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <list><value>activityService</value></list> </property> <property name="interceptorNames"> <list> <value>outsideInvokeLogInterceptor</value> </list> </property> </bean>