AOP简介
##AOP的概念:
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
它是一种思想,可在不改变程序源码的情况下为程序添加额外的功能。
AOP的发展阶段:
- 静态AOP:Aspect形式, 通过特定的编译器,将实现后的Aspect编译并织入系统的静态类中。
- 动态AOP:AOP的织入过程在系统运行开始只有进行,而不是预先编译到系统中。
AOP的主要意图:
允许通过分离应用的业务逻辑与系统级服务进行内聚性的开发。应用对象值实现业务逻辑即可,并不负责它的系统级关注点。
AOP的主要应用:
日志记录、跟踪、监控和优化,性能统计、优化,安全、权限控制,应用系统的异常捕捉及处理,事务处理,缓存,持久化,懒加载(Lazy loading),内容传递,调试,资源池,同步等等。
AOP术语:
- 连接点:程序执行的某个特定位置,比如类初始化前,初始化后,方法调用前,方法调用后等等
- 切点:通过切点来定位特定的连接点 。
- 增强:织入到目标类连接点上的一端程序代码。
- 目标对象:增强逻辑的织入目标类。
- 引介:引介是一种特殊的增强,他为类添加一些属性和方法。
- 织入:将增强添加对目标类的具体连接点的上的过程。
- 代理:一个类被AOP织入增强后,会产生一个结果类,该类融合了原类和增强逻辑的代理类。
- 切面:又切点和增强组成,既包括了横切逻辑的定义,也包括了连接点的定义。
AOP的实现者:
AspectJ:
AspectJ是目前最完善的AOP语言,对Java编程语言的进行了扩展,定义了AOP语法,能够在编译期间提供横切代码的织入。AspectJ提供了两种横切实现机制,一种称为动态横切(Dynamic Crosscutting),另一种称为静态横切(Static Crosscutting)。
AspectWerkz:
基于Java的简单、动态和轻量级的AOP框架,支持运行期或类装载期织入横切代码,它拥有一个特殊的类装载器。它与AspectJ项目已经合并,第一个发布版本是AspectJ5:扩展AspectJ语言,以基于注解的方式支持类似AspectJ的代码风格。
JBoss AOP:
JBoss是一个开源的符合J2EE规范的应用服务器,作为J2EE规范的补充,JBoss中引入了AOP框架,为普通Java类提供了J2EE服务,而无需遵循EJB规范。JBoss通过类载入时,使用Javassist对字节码操作实现动态AOP框架。
Spring AOP:
Spring AOP使用纯Java实现,不需要专门的编译过程,不需要特殊的类装载器,它在运行期通过代理方式向目标类织入增强代码。Spring并不尝试提供最完整的AOP实现,主要侧重于提供一种和Spring IoC容器整合的AOP实现,以解决企业级开发中常见问题。
AOP的实现方法
利用Proxy 实现AOP功能 :
采用Proxy类方法,基本流程为:主函数–>代理–>目标对象的方法。对于Proxy类有一个使用前提,就是目标对象必须要实现接口,否则不能使用这个方法。实现AOP功能步骤如下:
- 创建接口:StudentInterface.java
- 创建接口实现类:Student.java
- 创建代理工厂类:ProxyFactory.java
利用Proxy实现AOP功能的总结如下:
- 目标对象必须实现接口
- 返回创建的代理对象
- 重写invoke()方法
- 限制条件放在invoke()方法
利用CGLib 实现AOP功能 :
CGLib(Code Generation Library)是一个开源项目,它是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。实现AOP功能步骤如下所示:
- 引入Jar文件
- 创建实体类
- 创建CGLIB代理类
- 创建入口类进行测试
利用Spring注解方式实现AOP功能:
利用Spring注解方式来实现前置通知,后置通知,例外通知以及环绕通知等。实现AOP功能步骤如下:
- 引入Jar文件
- 配置AOP命名空间
- 创建目标对象类
- 创建切面
- 在配置文件中配置切面
- 创建入口类进行测试
利用Spring XML配置方式实现AOP功能:
利用Spring XML文件配置方式实现AOP功能步骤如下:
- 引入Jar文件
- 配置AOP命名空间
- 创建目标对象类
- 创建切面
- 在配置文件中配置
- 创建入口类进行测试
Spring AOP的增强类型:
1 前置增强
顾名思义就是在目标方法执行前织入增强。BeforeAdvice表示前置增强。属于Spring提供的增强所以属于方法级增强。MethodBeforeAdvice为目前可用前置增强。
2 后置增强
顾名思义就是在目标方法执行后织入增强。AfterReturningAdvice表示后置增强。属于Spring提供的增强所以属于方法级增强。
3 环绕赠强
MethodInterceptor是前置增强和后置增强的综合,在目标方法执行前后都织入增强。可以用该增强替换前置增强和后置增强
4 异常抛出增强
ThrowsAdvice表示在目标方法抛出异常时实施增强
5 引介增强
IntroductionInterceptor在目标类中添加属性和行为