面向切面编程(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>

 

posted @ 2017-07-29 12:24  Auto_passion  阅读(361)  评论(0编辑  收藏  举报