Spring除了支持Schema方式配置AOP,还支持注解方式:使用@Aspect来配置
@Component
@Aspect
public class LogInterceptor {
private Logger logger = LoggerFactory.getLogger(LogInterceptor.class);
@Pointcut("execution(* com.cyb.*.controller.*.*(..))")
public void pointCut() {
// logger.info("ponit....");
}
@Before("pointCut()")
public void before() {
// logger.info("被拦截方法调用之前调用此方法,输出此语句");
}
@After("pointCut()")
public void after() {
// logger.info("被拦截方法调用之后调用此方法,输出此语句");
}
@SuppressWarnings("rawtypes")
@Around("pointCut()")
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
String className = pjp.getTarget().getClass().getSimpleName();
String methodName = pjp.getSignature().getName() + "()";
Object[] paramValues = pjp.getArgs();
ObjectMapper objectMapper = new ObjectMapper();
List<Object> paramafter=new ArrayList<Object>();
for(Object param:paramValues){
if(!(param instanceof HttpServletRequest)
&&!(param instanceof HttpServletResponse)&&!(param instanceof HttpSession)){
paramafter.add(param);
}
}
String paramValuesStr=objectMapper.writeValueAsString(paramafter);
MethodSignature joinPointObject = (MethodSignature) pjp.getSignature();
String [] paramnames=joinPointObject.getParameterNames();
List<String> names=new ArrayList<String>();
for(String paramname:paramnames){
if(!"request".equals(paramname)&&!"response".equals(paramname)&&!"session".equals(paramname)){
names.add(paramname);
}
}
logger.info("类名: {}, 方法名: {}, 参数名: {},参数值: {}", new Object[] { className, methodName,
names, paramValuesStr });
Object obj = pjp.proceed();
Object logObj = obj;
if (obj != null) {
if (obj instanceof List && ((List) obj).size() > 10) {
logObj = ((List) obj).size();
}
}
String resultJson = objectMapper.writeValueAsString(logObj);
logger.info("类名: {}, 方法名: {}, 返回值: {}",
new Object[] { className, methodName, resultJson });
return obj;
}
}