从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介
来源:互联网 发布:淘宝平板版下载 编辑:程序博客网 时间:2024/06/11 12:59
AOP是面向切面编程。切面是AOP中的一个术语,表示从业务逻辑中分离出来的横切逻辑,比如性能监控,日志记录,权限控制等,这些供暖都可以从核心的业务逻辑代码中抽离出去。也就是说通过AOP可以解决代码耦合的问题,让职责更加单一。其实很早以前就出现了AOP这个概念。最知名最强大的java开源项目就是AspectJ,它的前身是AspectWerkz。直到后来老罗 Rod Johnson写了Spring框架,成为Spring之父。他在Spring的IOC框架基础上又实现了一套AOP框架,后来发现自己掉进了深渊,后台就集成了AspectJ。我们现在用的最多的想必就是spring+AspectJ这种AOP框架了。
一:Spring AOP
1,Spring AOP:前置增强,后置增强,环绕增强(编程式)
在Spring AOP的世界里,与AOP相关的术语挺多的。前面博客中提到的before方法,在Spring AOP里就叫Before Advice(前置增强)。有些人将Advice直译为“通知”,这是不合适的,因为它根本就没有“通知”的含义,而是对原有代码功能的“增强”。再者,CGLib中也有一个Enhancer类,它就是一个增强类。
此外,像前面的after这样的方法就叫After Advice(后置增强),因为它放在后面来增强代码的供暖。
如果能把before与after合并在一起,那就叫Around Advice(环绕增强)。
下面要做的就是去实现一个所谓的增强类,让他们横切到代码中,而不是将这些写死在代码中。
先来一个前置增强类,代码如下:
再来一个后置增强类:
最后看客户端把他们集成起来,看看如何调用:
看上面的代码,其实spring aop还是比较简单的,当然我们完全可以只定义一个增强类,让它同时实现MethodBeforeAdvice与AfterReturningAdvice这两个接口,代码如下:
这样只需一行代码就可以实现前置和后置增强了
还可以把前置增强和后置增强的功能结合起来,无需实现两个接口,代码如下:
以上就是Spring AOP的基本用法,但这只是编程式而已,Spring AOP还可以使用配置文件来使用AOP。
2,Spring AOP:前置增强,后置增强,环绕增强(声明式)
想看spring配置文件是如何写的:
看上面的注释,其实使用ProxyFactoryBean就可以取代前面的ProxyFactory,其实它们就是一回事。interceptorNames改名为adviceNames或许会更容易让人理解,就是往属性里添加了增加类。此外如果只有一个增强类,可以使用下面的方法来简化:
注意这里使用的是Spring 2.5+的Bean扫描特性,这样我们就无须在Spring配置文件里不断定义<bean id="x" class="xxx"/>,从而减少代码的配置。
代码量确实是少了,我们将配置性的代码放入了配置文件中,这样也有助于后期维护。更重要的是代码只关注业务逻辑,而将配置放入文件中,这是一条最佳实践。
除了上面提到的3类增强以外,还有两类增强需要了解下。
3,Spring AOP:跑出增强
程序报错,跑出异常了,一般的做法是打印到控制台或日志文件中,这样很多地方都得去处理,有没有一个一劳永逸的方法呢?那就是Throws Advice(抛出增强):
跑出增强需要实现org.springframework.aop.ThrowsAdviceJ接口,在接口方法中可获取方法,参数目标对象,异常对象等信息。我们可以把这些信息统一写入日志中,也可以持久到数据库中。这个功能很溜。但是还有一个更厉害的增强。如果某个类实现了A接口,但没有实现B接口,那么该类可以调用B接口的方法吗?看看下面的内容:
4,Spring AOP:引入增强
以上提到的都是对方法的增强,那能否对类进行增强?用AOP的行话来说,对方法的增强叫Weaving(织入),而对类的增强叫Introduction(引入)。Introduction Advice(引入增强)就是对类的功能增强,它也是Spring AOP提供的最后一种增强。
5,Spring AOP:切面
6,Spring AOP:自动代理(扫描bean)
7,Spring AOP:自动代理(扫描切面配置)
老罗的解决方案似乎已经掉进了切面类的深渊,这还真是所谓的“面向切面编程了”,最重要的是切面,最麻烦的也是切面。
必须要把切面配置简化掉,spring才能有所突破。
二:Spirng + AspectJ
这篇基本都是介绍AOP的知识,是我们要写框架的基础,但不是重点所以就截图“从零开始写javaweb”里面的代码了。
- 从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介
- 从零开始写javaweb框架笔记18-使框架具备AOP特性-代理技术简介
- 从零开始写javaweb框架笔记21-使框架具备AOP特性-ThreadLocal简介
- 从零开始写javaweb框架笔记22-使框架具备AOP特性-事务管理简介
- 从零开始写javaweb框架笔记20-使框架具备AOP特性-开发AOP框架
- 从零开始写javaweb框架笔记23-使框架具备AOP特性-实现事务控制特性
- [笔记]架构探险-从零开始写JavaWeb框架-2.2. 之使框架具有aop特性-干货,让框架支持事务处理
- [笔记]架构探险-从零开始写JavaWeb框架-2.1. 之使框架具有aop特性-aop框架加载与切面运行流程分析
- 《从零开始写JavaWeb框架》的AOP实现和SpringAOP实现的比较
- AOP框架简介
- 从零开始写javaweb框架笔记2-搭建web项目框架
- 从零开始写javaweb框架笔记16-搭建轻量级JAVAWEB框架-加载Controller,初始化框架
- 从零开始写javaweb框架笔记16-搭建轻量级JAVAWEB框架-加载Controller,初始化框架
- 从零开始写javaweb框架笔记7-动手开发web应用
- 从零开始写javaweb框架笔记10-搭建轻量级JAVAWEB框架-确定目标
- 从零开始写javaweb框架笔记11-搭建轻量级JAVAWEB框架-搭建开发环境
- 从零开始写javaweb框架笔记13-搭建轻量级JAVAWEB框架-开发一个类加载器
- 从零开始写javaweb框架笔记14-搭建轻量级JAVAWEB框架-实现Bean容器
- IOCP
- bootstrap的caret箭头实现
- Markdown的使用
- 功能测试很low?不能升级到高级测试工程师?
- NSCopying/NSMutableCopying
- 从零开始写javaweb框架笔记19-使框架具备AOP特性-AOP技术简介
- 【视频开发】【计算机视觉】doppia编译之四:安装其他库、编译和运行doppia
- LeetCode1-Two Sum
- android 简单逆向
- 杂谈0627
- 单行函数
- mac本安装mysql&&忘记密码后如何进行修改
- RandomAccessFile的编码转换问题
- javascript逻辑运算符“||”和“&&”