aop

来源:互联网 发布:手机淘宝如何买彩票 编辑:程序博客网 时间:2024/06/02 03:28
AOP (Aspect Oriented Programming:面向切面)通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。(java间接支持aop通过类库的支持)

aop与oop的区别:
oop:针对业务处理过程的实体机其属性和行为进行抽象的封装,已获得更加清晰高效的逻辑单元划分
aop:针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,一获取得逻辑过程中各个部分之间低耦合的隔离效果。
横切关注点:在分布于应用中多处的功能。

AOP主要实现功能:实现非用户功能,日志记录,性能统计,安全控制,事务处理,异常处理。

AOP术语:
1,连接点Joinpoint(就是要插入代码的位置):程序执行的摸个特定位置(如类开始初始化前,类初始化,类某个方法用钱,调用后,方法抛出异常后),一个类或者一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就称为连接点,(Spring不支持类的执行前)
2,切点Pointcut(查找连接点的方式或者条件):每个类一般都拥有多个连接点(一般一个方法就是一个连接点)。AOP需要定位到特定的连接点,而定位连接点的方式称为切点,连接点相当于数据库中的记录,而切点相当于查询条件,一个切点可以匹配多个连接点。
3,增强Advice(需要植入的代码):增强是植入到目标类连接点上的一段程序代码。在Spring中,增强除用于描述一段程序代码,还拥有另一个和连接点相关的信息执行点的方位。
4,目标对象Target;它是增强逻辑的植入目标类。通过Aop,业务逻辑类只需要实现非横切逻辑的代码,而性能监视,事物管理,横切逻辑则可以使用AOP动态植入到特定的连接点上。
5,引介Introduction:引介是一种特殊的增强,它为类真假一些属性和方法。
6,织入Weaving(插入代码的过程):织入是将增强添加对目标类具体连接点上的过程。:编译器织入(需要特殊java编译器),类转载器织入(特殊类加载器),动态代理织入(Spring用的)
7,代理Proxy:一个类被Aop织入增强后,就产出一个结果类,它是融合了原类和增强逻辑的代理类。根据不同的代理方式,代理类即可能是和原类具有相同接口的类,也可能就是原类的子类。所以,可以采用调用原类相同的方式调用代理类。
8,切面Aspect:切面是由切点和增强或者引介组成,它既是包括和横切逻辑的定义,也包括了连接点的定义。

设计模式:Design Pattern
是一套反复使用,多人知晓,经过分类编目,代码设计经验的总结,每一个设计模式都是一类典型问题的解决方案。
这些设计模式中的每一个都具有典型意义,具有学习价值,通过研究这些模式可以相互交流,可以在实际项目开发中加以应用,从而得到更好地设计(可维护性,可扩展性,可测试性)
设计模式不能套用,不要以为在任何一个系统中都要使用设计模式,系统的设计也不是含有设计模式就好,根不是越多设计模式越好。
设计模式的本质是面向对象方法的实际的运用,具体而言,就是封装,继承,多态的反复使用。要真正理解设计模式就要理解面向对象设计原则,和面向对象三大特征。《java设计模式》《大化设计模式》《研磨设计模式》《设计模式之蝉》《head first设计模式》

代理设计模式;

1,定义:
为其他对象提供一种代理以控制对这个对象的访问。使用代理模式创建代理对象,让代理对象控制目标对象的访问,并且可以在不在改变目标对象的情况下添加一些额外的功能。

2,UML类图 

3,优点:
代理模式能将代理对象与目标对象分离,在一定程度上降低了系统的耦合度。
代理模式在客户端和目标对象起到了一个中介的作用,这样可以起到保护目标对象的作用,代理对象也可以对目标对象调用之前进行其他操作。

4,缺点:
在客户端在目标对象增加了一个代理对象,会造成系统性能下降。
一定程度上增加了系统的复杂度

5,使用场景
远程代理:为一个位于不同地址空间的对象提供一个本地的代理
虚拟代理:如果需要创建一个需要消耗较大的对象,先创建一个消耗较小的对象来表示,真实对象只在需要时才被创建(加载图片用小图片代替)
安全代理:用来控制对目标对象的访问权限(防火墙)
延时加载:访问数据库时候创建代理对象,当真正使用数据时候在真正去获取数据

SpringAOP:使用纯Java实现,它不需要专门的编译过程,也不需要特殊的类转载器,塔在运行期通过代理的方式向目标类织入增强代码,SpringAOP使用了两个代理机制,JDK动态代理和CGLib动态代理,它们是SpringAOP底层技术

增强类型:
前置增强:在目标方法执行前插入织入代码
后置增强:在目标方法调用后织入代码
环绕增强:在目标方法调用前后织入代码
异常抛出增强:抛出异常织入代码
引介增强:在目标类直接添加属性和方法

切面:
Spring Aop:支持两张方法匹配器
静态方法匹配器:对方法名签名(包括方法名和入参类型及顺序)进行匹配,仅会判别一次
动态方法匹配器:支持在运行期检测方法入参的值,每次方法调用都必须判断,动态匹配对性能影响大,不常用。

切点:
静态方法切点
动态方法切点
注解切点
表达式切点
流程切点
复合切点

Spring AOP:
由于动态切点检测会对性能造成很大的影响,应当尽量避免在运行是每次都对目标类的个个方法进行动态检测
Spring 采用的机制是在创建代理时对目标类的每个连接点,使用静态切点检查,如果仅通过静态切点检查就可以知道连接点是不匹配的,则运行是就不在进行动态检查,如果静态切点检查是匹配的,在运行是才能进行动态切点检查
在动态切点类定义静态切点检查的方法可以防止不必要的动态检查操作,可以极大地提高运行效率。


springAop注解
@before用于前置增强注解 配置在切面方法上


表达式支持通配符:
 * 代表任意字符,匹配上下文中的一个元素
..代表任意字符,可以匹配多个元素,但是表示类的时候不能当杜使用,必须和*配合:在代表形参的时候可以单独使用;
+代表安类型匹配指定类的所有类(包括子类),只能跟在类名后面