AOP面向切面编程,增加功能不需要修改源代码实现
底层原理
在对已经定义好方法的类想要增加功能
(1)纵向抽取机制
再定义一个类,类中写增强方法,然后去继承这个类,在子类中调用父类中写的增强方法。这种方式叫做纵向抽取机制,但是不能从根本解决问题。父类中的方法修改名字,子类中也要修改源代码。
(2)横向抽取机制
就是AOP切面编程,分为两种情况。
当要增强的类中有实现的接口,则借助jdk动态代理,即创建代理和增强类的对象的平级对象
当要增强的类没有实现接口,借助cglib动态代理,创建要增强类的子类的代理对象,在子类中调用父类的方法完成增强
基本术语
连接点(joinpoint):增强类中定义的方法,或者说可以被增强的方法
切点(pointcut):实际被增强的方法
增强/通知(advice):要添加功能的实现,分为前置通知,后置通知,环绕通知,异常通知,最终通知(在后置之后执行)
切面(aspect):把增强用在切点的过程叫做切面
引介(introduction):可以在运行期动态的增加一些方法或者属性
目标对象(target):被增强的类
织入(weaving):把增强应用到目标的过程,把advice应用到target的过程
代理(proxy):一个类被AOP织入增强后就产生一个结果代理类
Aspectj框架
是一个面向切面的框架,与spring配合使用,实现AOP(spring2.0以后增加对aspectj的支持)
使用aspectj实现AOP有两种方式
-
基于aspectj的xml配置文件
表达式配置切点
使用execution表达式配置切点execution(<访问修饰符><返回类型><方法名>(<参数>)<异常>)
execution(* xidian.lili.anno.Book.add(..))
execution(* xidian.lili.anno.Book.*(..))//增强book中的所有方法
execution(* *.*(..))//所有类的方法
execution(* save*(..))//增强以save开头的方法
配置增强类型
代码:
配置文件:
-
基于aspectj的注解
首先创建增强类Mybook和被增强类Book,在spring配置文件中创建两个类的对象,这些步骤与上述一致
然后在配置文件中开启aop操作
然后就是在增强类中添加注解
即可实现