AOP
Aspect Oritented Programming 的缩写, 面向切面编程.
是通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.
AOP 是一个概念, 没有设定具体的语言. 它克服了那些只有单继承特性的语言的缺点.
spring2.0 后整合了 AspectJ 的技术
AspectJ
是一个面向切面的框架. 扩展了 java 语言, AspectJ 定义了 aop 的语法,
所以它有一个专门的编译器用来生成遵守 java 的字节编码的规范的 class 文件.
aop: 主要的功能: 日志记录, 性能统计, 安全控制, 事务处理, 异常处理等.
(在调用 service 层的时候, 进行一个横切, 进行代理. 然后再进行 service 层的触发.)
AOP 和 OOP 的区别
1,oop:(面向对象编程) 是对业务处理过程的实体, 属性和行为进行抽象的封装,
来获得更加清晰高效的逻辑单元划分.
2,aop:(面向切面编程) 是对业务处理过程中切面的提取. 面对的是处理过程中的
每一个步骤和阶段. 以获得逻辑过程中的各部分之间的低耦合性的隔离效果,
AOP 的相关术语
1,target ( 目标对象 ): 指需要被增强的对象. 由于 spring aop 的通过代理模式实现的.
这个对象永远都是被代理对象.
2,join point ( 连接点 ): 指被拦截的点 ( 方法 ) ; spring 支持方法类型的连接点.
3,pointcut ( 切入点 ) : 指一组 join point ; 通过逻辑关系组合起来, 或通过通配, 正则表达式等方式集中起来.
定义了相应的 Advice 将要发生的地方.
4,advice ( 通知 ): 就是拦截到连接点之后, 需要做的事情. 通知分为前置通知, 后置通知, 异常通知,
最终通知, 环绕通知, 定义了在 pointcut 里面定义的程序点具体要做的操作.
5,introduction ( 引介 ) : 是一种特殊的通知. 在不修改类代码的前提下. 可以在运行期间为类动态的添加一些方法或属性.
6,aspect ( 切面 ) : 是切入点和通知的结合.
7,weaving ( 织入 ) : 是一个过程, 是将切面应用到目标对象从而创建出 aop 代理对象的过程.
织入可以在编译期, 类装载期, 运行期进行. spring 使用动态织入. aspectJ 使用静态织入.
8,proxy ( 代理 ) : 一个类被 aop 织入增强后, 就产生一个结果代理类.
AOP 的底层开发
AOP 分为静态 aop 和动态 aop.
静态 aop: 是指 aspectJ 实现的 aop, 将切面代码直接编译到 java 类文件中.
动态 aop: 是 spring 实现的 aop, 将切面动态的织入实现的 aop.
实现技术: JDK 动态代理, CGLIB 动态代理.
JDK 动态代理: 在运行期间 JVM 会动态的生成 class 字节码对象 (class 对象) (只针对接口操作)
CGLIB 动态代理 (Code Generation Library): 是一个开源的项目. 在运行期间扩展 java 类与实现 java 的接口.
CGLIB 的底层是使用一个快而小的字节码框架 ASM, 来转换字节码并生成新的类.
如果是单独使用. 侧需要导入: cglib,asm 的 jar 包; 但是使用 spring 来开发, 侧需要导入 spring-core 的 jar 包.
AOP 传统开发
需要导入核心 jar 包和依赖 jar 包
传统开发中有 5 种开发: org.springframework.aop. 包下
MethodBeforeAdvice: 前置通知; AfterReturningAdivce: 后置通知;
MethodInterceptor: 环摇通知; ThrowsAdivce: 异常通知;
IntroductionInterceptor: 引介通知
传统的 aop 开发, 需要每一步都手动创建, 并实现.
在上传的文件中有源码.
基于 aspectJ 的开发
基于 aspectJ 开发, 和传统的相比就是配置的时候, 基于 aspectJ. 这样开发起来比较简单.
还需要导入 aspectj 的包. aspectJ.weaver 的 jar 包
在上传的文件中有源码.
配置的正则表达式还有
AspectJ 基于 xml 开发 aop
spring 框架在默认的情况下, 是对有接口的类使用 proxy 代理的.
<aop:config proxy-target-class="false">
false: 代表有接口使用 proxy 代理;
true : 使用 cglib 代理, 不考虑是否有接口.
在上传的文件中有源码.
AspectJ 注解开发
直接是在类里面使用注解. 然后在配置文件中进行一个代理.
在上传的文件中有源码.
来源: http://www.bubuko.com/infodetail-3357571.html