对于面向对象的编程,虽然我们一直在使用设计模式,一直在使用接口等各种方法来提高代码的不重叠,就算我们把一些经常用到的处理当做一个工具类来定义,然后我们在各个应用程序中去调用这个类的方法,虽然这样是可以减少了代码的重复,但是这样也还是存在缺点的,那就是你需要显示的去调用这个类,但是如果你使用了AOP 就不一样了 你完全可以不用显示的去调用某个类了,AOP会自动的帮你拦截调用
其实java中对代码的可重用行 还是进行了很多是工作的,比如我们经常看到的继承,比如我们经常看到的封装等 全部都是为了能够实现代码的可重用性,但是AOP会比这些还要强大
AOP这个概念不是说只有spring中有,其他的框架和开发语言中也是存在这个概念的,另外还有专门的AOP联盟来定义各种规范
AOP其实和我们封装一个公共函数很相似,也是把一些可复用的代码给抽取出来,在需要是时候统一调用这些公共代码,但是AOP的好处是他还提供了如何使用这些公共代码的丰富灵活手段,这些手段主要包括 PROXY代理,拦截器,字节码翻译技术(CGLIB)等横切技术
根据AOP联盟的定义 一般来说AOP可以分为三个层次:
第一个层次:这一层就是具体到了具体的开发语言了,这一层主要组成内容如下
应用逻辑需求 + 抽取出来的模块 + 如何植入的配置
一般我们也会这样的表示他们
基础 + 切面 + 配置
一般来说
基础就是待增强对象或者理解为目标对象
切面都是对基础的增强应用
而 spring的 AOP 实现是用java 语言来实现的,基础部分也就是POJO 了 那当然可以用普通的IOC容器来产生了,而切面说白了也是可以用IOC完成的 所以说spring的AOP也是基于spring的IOC来完成的
第二个层次 回答了第一层怎么配置的问题 这一层中 spring提供了很多的配置API 让第一层来调用 比如我们经常看到方法调用前配置 BeforeAdvice 等
第三个层次就是具体到了怎么实现这些配置了也就是回答了第二层的问题了 所以他对第二层提供了很多的API 而怎么实现这些配置 就是告诉 怎么实现在方法调用前就可以调用某个 切面呢 这个实现的方法一般有 使用代理,使用字节码翻译 使用拦截器等技术
下面我们来说几个AOP的主要概念
一。advice 通知
advice的主要作用是定义再连接点做什么,其中连接点可以看做就是方法,这其中主要使用 回调函数来实现
spring 中 通知有下面几个
1.BeforeAdvice 前置通知
2.AfterAdvice 后置通知
3.ThrowAdvice 异常通知
二 。PointCut 切点
pointcut 主要是在有了通知的基础上 来决定这个通知到底要作用到那个方法上,也就说这个pointcut可以定义需要增强的方法的集合,这些集合的选取是通过一定的规则来完成的。也就说pointcut需要标识方法来做到让通知能够作用到具体的一个方法上去
三 。advisor 通知器
在有了前面两步中 我们有了 通知 那么就有了我们的增强程序,然后有了pointcut 就可以知道哪些方法需要配AOP使用,但是你还不知道这些需要AOP的程序要使用那个通知来进行自自己的功能增强 那么通知器 就出现了 它就是做这个的,他可以把通知和 切点连接在一起
其实java中对代码的可重用行 还是进行了很多是工作的,比如我们经常看到的继承,比如我们经常看到的封装等 全部都是为了能够实现代码的可重用性,但是AOP会比这些还要强大
AOP这个概念不是说只有spring中有,其他的框架和开发语言中也是存在这个概念的,另外还有专门的AOP联盟来定义各种规范
AOP其实和我们封装一个公共函数很相似,也是把一些可复用的代码给抽取出来,在需要是时候统一调用这些公共代码,但是AOP的好处是他还提供了如何使用这些公共代码的丰富灵活手段,这些手段主要包括 PROXY代理,拦截器,字节码翻译技术(CGLIB)等横切技术
根据AOP联盟的定义 一般来说AOP可以分为三个层次:
第一个层次:这一层就是具体到了具体的开发语言了,这一层主要组成内容如下
应用逻辑需求 + 抽取出来的模块 + 如何植入的配置
一般我们也会这样的表示他们
基础 + 切面 + 配置
一般来说
基础就是待增强对象或者理解为目标对象
切面都是对基础的增强应用
而 spring的 AOP 实现是用java 语言来实现的,基础部分也就是POJO 了 那当然可以用普通的IOC容器来产生了,而切面说白了也是可以用IOC完成的 所以说spring的AOP也是基于spring的IOC来完成的
第二个层次 回答了第一层怎么配置的问题 这一层中 spring提供了很多的配置API 让第一层来调用 比如我们经常看到方法调用前配置 BeforeAdvice 等
第三个层次就是具体到了怎么实现这些配置了也就是回答了第二层的问题了 所以他对第二层提供了很多的API 而怎么实现这些配置 就是告诉 怎么实现在方法调用前就可以调用某个 切面呢 这个实现的方法一般有 使用代理,使用字节码翻译 使用拦截器等技术
下面我们来说几个AOP的主要概念
一。advice 通知
advice的主要作用是定义再连接点做什么,其中连接点可以看做就是方法,这其中主要使用 回调函数来实现
spring 中 通知有下面几个
1.BeforeAdvice 前置通知
2.AfterAdvice 后置通知
3.ThrowAdvice 异常通知
二 。PointCut 切点
pointcut 主要是在有了通知的基础上 来决定这个通知到底要作用到那个方法上,也就说这个pointcut可以定义需要增强的方法的集合,这些集合的选取是通过一定的规则来完成的。也就说pointcut需要标识方法来做到让通知能够作用到具体的一个方法上去
三 。advisor 通知器
在有了前面两步中 我们有了 通知 那么就有了我们的增强程序,然后有了pointcut 就可以知道哪些方法需要配AOP使用,但是你还不知道这些需要AOP的程序要使用那个通知来进行自自己的功能增强 那么通知器 就出现了 它就是做这个的,他可以把通知和 切点连接在一起