a) 什么是AOP?
AOP(Aspect Oriented Programming),也就是面向切面编程,是对面向对象编程OOP的一种补充;通过“横切”技术剖解开封装的对象内部,把那些公共的行为封装到一个可重用模块,称为“切面”。这样的话,就可以通过切面编写一些与业务无关的逻辑,减少代码的重复,降低模块之间的耦合度,便于开发和维护。常用的场景有日志、事务、权限控制。
AOP底层原理是代理和反射;
代理有静态代理(用得少)和动态代理;
动态代理有jdk代理和cglib代理,jdk的局限是被代理的类必须实现了接口,cglib代理底层基于ASM字节码的,所以效率较高。Spring中这两种都有使用。
b) AOP关键术语
切面:通知和切点的结合,通知和切点共同定义了关于切面的全部内容——它是什么,在何时和何处完成其功能。被模块化的特殊对象。切面类是被我们抽取出来的公共业务逻辑;如日之类。
通知:定义了切面方法什么时候使用;
连接点:程序中任何可以插入切面的一个点。也就是说,程序里的任何一个方法调用甚至是属性修改,都可以看出是连接点;
切点:需要我们切面处理的方法,被称为切点;类比:连接点相当于数据库中的记录,切点相当于查询条件
织入、引入(给已有的类添加方法)
c) 通知类型
Before、After、After-Throwing、After-Returning、Arround
前置通知、后置通知、环绕通知、异常通知、最终通知
d) AOP使用场景举例
日志、事务
e) AOP实现方式
经典代理:说白了,自己编写代码利用动态代理实现,
①. 通过实现MethodBeforeAdvice,AfterReturningAdvice,ThrowsAdvice等来编写一个自己的切面类
②. 利用DefaultPointcutAdvisor来组织切点。
③. 通过ProxyFactoryBean来定义配置切面。
基于XML的: 用到aop:config(aop配置根节点)、aop:aspect(定义切面)、aop:pointcut(定义切点)、aop:advisor(组合切点和切面的)等标签。
基于注解:需要配置aop:aspectj-autoproxy,然后使用@Aspect,@PointCut,@Before,@After….等注解。
f) Spring AOP的粒度
Spring AOP的粒度只能到方法级别,不能拦截对象字段的修改
**
基本使用情况
**