##1.AOP的应用范围
AOP的出现提供了另一种 关注点分离 的实现。试想操作数据库的过程中,往往包含以下步骤:
- 取得数据库连接;
- 执行一系列的数据操作逻辑;
- 如果2步骤抛异常,则进行数据回滚;
- 释放数据库连接;
使用Hibernate来实现的话,翻译为java代码
Session session = null;
try {
session = sessionFactory.getCurrentSession();
session.beginTransaction();
session.save(new Person()); //A
session.save(new Dog()); //B
session.save(new Cat()); //C
session.getTransaction().commit();
} catch(SQLException e) {
session.getTransaction().rollback();
} finally {
session.close();
}
这上面的代码中,其实只有A、B、C三句是业务逻辑的代码,但是这里却编写了一大推关于数据连接和事务操作的代码,而且在其他的方法中,它们的步骤几乎都是一致的,根据 Do Not Repeat Yourself 原则,急需一种手段将重复的代码分离出来,使程序员专注于业务逻辑( 关注点分离 )。解决的方案有很多,而AOP则是优雅的解决方案之一。
根据统计,AOP的应用范围主要在:
- 权限处理
- 事务处理
- 错误处理
- 调试
- 记录跟踪、优化、校准
- 性能优化
- 缓存
- 持久化
Spring Security使用AOP来实现权限管理,Spring使用AOP实现事务管理。Spring Insign使用AOP来实现调试。而JBoss服务器更是使用了AOP实现了以上所有的功能。有些人会提到使用AOP来实现日志记录,个人赶脚使用AOP来实现日志记录还是有点蹩脚的,难以实现高度自定义的日志。
##2.AOP的实现
AOP的实现大体分类两大类: 基于字节码 和 动态代理 。基于字节码和动态代理的AOP实现,可以说是各有各的优势和缺点。
-
AspectJ是基于字节码实现的,它可以在编译期间织入代码,这需要它有特殊的编辑器。
-
AspectWerkz支持运行期和类转载期织入代码,它拥有特殊的类转载器。
-
Spring AOP则是基于动态代理实现的AOP机制。