3.33统一日志

36 阅读1分钟

spring AOP运行时植入代码,代理实现,比aspectj更加具有性价比,但是功能不如他强大。他们都是基于AOP

VV8S151KY3)YY0E%D2IITIG.png

代理两种方式,JDK是自带的,CGLib是第三方的。JDK是自带的,CGLib是第三方的。使用JDK,目标对象必须有接口,代理对象就是生成接口的一个实现类。我们的service没有,所以用不来。拎一个通过子类作为代理对象

代理都是操作他的代理类。

VV8S151KY3)YY0E%D2IITIG.png

之前我们针对controller表现层的异常统一处理了,并且记录了日志

这次我们记录下,所有访问service方法的业务代码。

Component
@Aspect
public class ServiceLogAspect {

    private static final Logger logger = LoggerFactory.getLogger(ServiceLogAspect.class);

    /**
     * 第一个* 表示所有返回值 xx包下的所有类 方法 参数。都要处理
     */
    @Pointcut("execution(* com.cjh.community.service.*.*(..))")
    public void pointcut(){

    }

    @Before("pointcut()")
    public void before(JoinPoint joinPoint){
        //这个工具类可以获取请求,用强转为子类,功能更多
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        String ip = request.getRemoteHost();
        String now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
        //调用的类及其方法名,记录下来.xx.xx.service.xxx()
        String target = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName();
        logger.info(String.format("用户[%s],在[%s],访问了[%s].",ip,now,target));
    }