面向切面编程(aop)
1、AOP的概念:
aop采用了横向抽取机制替代了传统地纵向继承体系的重复性代码,不通过过修改源代码可以实现功能的添加
2、AOP的原理:
使用动态代理的方式,创建接口实现类的代理类
注:使员工jdk的动态代理是针对有接口的情况
使用cglib动态代理是针对没有接口的情况,创建某个类子类的代理类
3.AOP的相关术语:
1)JointPoint(连接点):那些被拦截到的点,主要指方法,因为spring框架中只支持方法类型的连接点,也就是类里面可以被增强的方法
2)PointCut(切入点):对哪些需要拦截的JointPoint的定义,实际就是类里面实际被增强的方法
3)Advice(通知\增强):对拦截到的JointPoint所做的事叫做通知,通知分为前置通知,后置通知,环绕通知,异常通知,最终通知(切面需要完成的功能),就是实际添加的功能的逻辑
前置通知:方法之前执行
后置通知:方法之后执行
环绕通知:方法之前之后执行
异常通知:方法异常执行
最终通知:后置之后执行
4)Aspect(切面):通知与切入点的结合,把增强具体应用到切入点的过程
5)Introduction(引介):在不修改代码的前提下,在运行期间动态的向类中添加一些属性或者方法
6)Target(目标对象):代理的目标对象(要增强的类)
7)Weaving(织入):把增强应用到目标的过程就是advice应用到Target的过程
8)Proxy:一个目标类织入AOP增强后产生的一个代理类
4、使用AspectJ操作实现AOP操作:
AspectJ是一个面向切面的框架,它扩展了java语言,定义了aop的语法,所以它有一个专门的编译器来生成符合java字节码规范的class文件
spring2.0之后增加了对AspectJ的支持,建议使用AspectJ来进行AOP操作
使用AspectJ需要导入aop以及AspectJ相关的jar包
使用AspectJ实现aop操作有俩种方式:
1)xml配置文件:
<aop:config>
<!-- 配置切入点 -->
<aop:pointcut expression="execution(* aop.Book.add(..))" id="pointcut1"></aop:pointcut>
<!-- 配置切面:把增强用到具体的方法的过程 -->
<aop:aspect ref="myBook" >
<!-- 配置增强类型 method:增强类里面使用哪个方法作为前置通知 -->
<aop:before method="before1" pointcut-ref="pointcut1"/>
<aop:after-returning method="after1" pointcut-ref="pointcut1"/>
<aop:around method="around1" pointcut-ref="pointcut1"/>
</aop:aspect>
</aop:config>
2)注解
<!-- 使用注解的方式实现aop操作 -->
<context:component-scan base-package="aop"></context:component-scan>
<!-- 开启aop操作的自动代理 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>