Spring AOP面向切面编程,可以用来配置事务、做日志、权限验证、在用户请求时做一些处理等等。用@Aspect做一个切面,就可以直接实现。
1、包结构
2、切面类
execution解释:
1)execution(), 表达式主体
2)第一个*表示返回类型,*表示所有类型
3)包名,后面两个..表示当前包和当前包所有子包
4)第二个*表示所有类名,*表示所有类
5)*(..):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数。
package com.test; import com.alibaba.fastjson.JSON; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; /** * @author zyydd * @date 2019/12/25 19:53 */ @Aspect @Service public class BizLogAop { private static final Logger logger = LoggerFactory.getLogger(BizLogAop.class); @Around("execution(* com.test.bizA..*.*(..)) || " + "execution(* com.test.bizB.TestServiceB1.*(..)) || " + "execution(* com.test.bizC.TestServiceC.test1(..))") public Object aroundBiz(ProceedingJoinPoint pjp) throws Throwable { String methodFullName = ""; try { methodFullName = String.format("%s.%s", pjp.getSignature().getDeclaringType().getName(), pjp.getSignature().getName()); logger.info("methodFullName={} 开始调用,参数={}", methodFullName, JSON.toJSON(pjp.getArgs())); } catch (Exception ex) { logger.error("BizLogAop类异常", ex); } //调用实际的方法,如果没有异常直接返回结果 Object result = pjp.proceed(pjp.getArgs()); try { logger.info("methodFullName={} 调用完成,返回值={}", methodFullName, JSON.toJSON(result)); } catch (Exception ex) { logger.error("BizLogAop类异常", ex); } return result; } }