AOP帮我们解决的问题

(业务对象)目标对象实现了接口(有标准好控制),并且有很多业务方法。业务方法执行之前要进行权限控制,事务控制或者日志处理-这些都可以在切面来做。
@annotation注解方式的切入点表达式-细粒度切入点表达式,可以具体到方法(比如使用注解修饰方法,在方法执行时进行日志记录)

@Pointcut("@annotation(com.common.anno.RequestLog)")

@bean方法的切入点表达式-粗粒度的切入点配置,不能精确到具体方法

@Around("bean(sysRoleServiceImpl)")

@RequestLog("分页查询")


AOP帮我们解决的问题_第1张图片

在业务执行的过程添加日志:SysUserService是个业务接口,SysUserServiceImpl实现了SysUserService接口。SysUserController控制层对象关联了业务层的SysUserService接口,假如在不改变原有代码的情况下,想为对象添加扩展功能。JDK产生一个$Proxy代理对象,代理SysUserServiceImpl目标对象。这个代理类也实现了SysUserService接口,Controller直接调用代理对象,先通过代理对象调用加上一些扩展功能(SysLogAspect切面中的方法-环绕通知),再调用目标对象SysUserServiceImpl的核心功能(方法)。

        long startTime=System.currentTimeMillis();
        //调用执行目标方法(result为目标方法执行结果)
        Object result=jointPoint.proceed();
        long endTime=System.currentTimeMillis();
        //保存日志信息并存储到数据库
        saveObject(jointPoint, endTime-startTime);

代理对象由底层产生,spring如何产生代理对象?假如被代理类实现了接口,代理对象是通过jdk的动态代理产生的。如果被代理类没实现接口,代理对象是通过第三方库cglib产生。

你可能感兴趣的:(AOP帮我们解决的问题)