Spring之AOP小结(一)
AOP(Aspect-OrientedProgramming,面向切面编程):
OOP(Object-Oriented Programing,面向对象编程)的补充和完善,OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。但当需要为分散的对象引用共同的功能时,OOP则在此时不能适应。即,OOP适应于定义从上到下的关系,但并不适合定义从左到右的关系。如常用的日志、登录、认证…等功能,这些功能通常的情况下水平地散布在所有对象层次中,而与它所散布到的对象的核心业务功能往往关系不大。这种散布在各处的与核心业务功能关系不大的代码被称为横切(cross-cutting)代码,在OOP设计中,它导致了大量代码的重复,而不利于代码的复用性。
AOP,用一种“Aspect(切面)”技术,剖解开封装的对象内部,并将那些影响了多个类的公共代码封装到一个可重用模块。即,将那些与核心业务无关,却为业务模块所共同调用的逻辑代码封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于代码的可操作性和可维护性。
OOP中对象即是一个空心的圆柱体,其中封装的是对象的属性和行为;那么AOP就是将这些空心圆柱体剖开(但不影响这个圆柱即对象的完整性),以获得其内部的消息。而剖开的切面,也就是所谓的“Aspect(切面)”了。
Aspect(切面)图解:
使用AOP:
技术分类:
一:采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行。
二:采用静态织入的方式,引入特定的语法创建“切面”,从而使得编译器可以在编译期间织入有关“切面”的代码。
实现方式:
一:配置文件:
- 配置ProxyFactoryBean,显式地设置advisors, advice, target等。
- 配置AutoProxyCreator,这种方式下,还是如以前一样使用定义的bean,但是从容器中获得的其实已经是代理对象。
- 通过< aop:config > 来配置
- 通过<aop: aspectj-autoproxy>来配置,使用AspectJ的注解来标识通知及切入点
二:编程的方式:
直接使用ProxyFactory来以编程的方式使用Spring AOP,通过ProxyFactory提供的方法可以设置target对象, advisor等相关配置,最终通过 getProxy()方法来获取代理对象。
AOP使用场景
Authentication 权限
Caching 缓存
List item
Context passing 内容传递
Error handling 错误处理
Lazy loading 懒加载
Debugging 调试
logging, tracing, profiling and monitoring 记录跟踪 优化 校准
Performance optimization 性能优化
Persistence 持久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务
AOP相关术语:
1)连接点(Joinpoint)
程序执行的某个特定位置:如类开始初始化前、类初始化后、类某个方法调用前、调用后、方法抛出异常后。一个类或一段程序代码拥有一些具有边界性质的特定点,这些点中的特定点就称为“连接点”。Spring仅支持方法的连接点,即仅能在方法调用前、方法调用后、方法抛出异常时以及方法调用前后这些程序执行点织入增强。连接点由两个信息确定:第一是用方法表示的程序执行点;第二是用相对点表示的方位。
2)切点(Pointcut)
指定一个通知将被引发的一系列连接点的集合。 每个程序类都拥有多个连接点,如一个拥有两个方法的类,这两个方法都是连接点,即连接点是程序类中客观存在的事物。AOP通过“切点”定位特定的连接点。连接点相当于数据库中的记录,而切点相当于查询条件。切点和连接点不是一对一的关系,一个切点可以匹配多个连接点。在Spring中,切点通过org.springframework.aop.Pointcut接口进行描述,它使用类和方法作为连接点的查询条件,Spring AOP的规则解析引擎负责切点所设定的查询条件,找到对应的连接点。其实确切地说,不能称之为查询连接点,因为连接点是方法执行前、执行后等包括方位信息的具体程序执行点,而切点只定位到某个方法上,所以如果希望定位到具体连接点上,还需要提供方位信息。
3)增强(Advice)
增强是织入到目标类连接点上的一段程序代码,在Spring中,增强除用于描述一段程序代码外,还拥有另一个和连接点相关的信息,这便是执行点的方位。结合执行点方位信息和切点信息,我们就可以找到特定的连接点。
4)目标对象(Target)
包含连接点的对象。也被称作被通知或被代理对象,POJO。如果没有AOP,目标业务类需要自己实现所有逻辑,而在AOP的帮助下,目标业务类只实现那些非横切逻辑的程序逻辑,而性能监视和事务管理等这些横切逻辑则可以使用AOP动态织入到特定的连接点上。
5)引介(Introduction)
引介是一种特殊的增强,它为类添加一些属性和方法。这样,即使一个业务类原本没有实现某个接口,通过AOP的引介功能,我们可以动态地为该业务类添加接口的实现逻辑,让业务类成为这个接口的实现类。
6)织入(Weaving)
织入是将增强添加对目标类具体连接点上的过程。AOP像一台织布机,将目标类、增强或引介通过AOP这台织布机天衣无缝地编织到一起。根据不同的实现技术,AOP有三种织入的方式:
a、编译期织入,这要求使用特殊的Java编译器。
b、类装载期织入,这要求使用特殊的类装载器。
c、动态代理织入,在运行期为目标类添加增强生成子类的方式。
Spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入。
7)代理(Proxy)
一个类被AOP织入增强后,就产出了一个结果类,它是融合了原类和增强逻辑的代理类。根据不同的代理方式,代理类既可能是和原类具有相同接口的类,也可能就是原类的子类,所以我们可以采用调用原类相同的方式调用代理类。
8)切面(Aspect)
切面由切点和增强(引介)组成,它既包括了横切逻辑的定义,也包括了连接点的定义,Spring AOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的连接点中。