AOP的概念
刚刚第一个增删改查应用其实还很贫弱,缺少一些常见的内容,比如:- 缺少安全检查功能,一般不会允许直接进行增删改查。Web应用最基础的操作一般都需要用户身份验证,至少登录的用户才被允许做一些事情。
- 缺少日志功能,这是一般程序都应该有的功能。
- 日志,安全,事务处理
- 系统审计,谁/何时/何地/操作何种内容
- 异常处理,比如通过邮件系统通知开发者
- 系统级API管理和统计,比如用户调用了多少次API,系统访问的高峰是什么时段,平均负载是多少?
- 模块可重用
- 解决代码重复次数多的问题,耦合程度高的问题
- 解决代码太分散,不易修改的问题
- 可通过配置进行修改,灵活程度高
- 切面过多的话,系统设计复杂,不易跟踪具体操作
- 运行时效率比不使用切面要低(因为切面使用了代理服务)
Spring对AOC的支持
几个术语先要熟悉一下:Aspect
,切面,就是指提供切面服务的组件,比如日志组件,安全组件Advice
,执行到哪一个业务逻辑的时候应该引入切面功能,这个业务逻辑就是adviceJoin Point
,在程序执行到何处时需要应用切面Pointcut
,切点,就是指切面与原来程序相交汇的地方Before advice
,在业务逻辑执行前引入切面After finally advice
,在业务逻辑执行后(无论成功与否)引入切面After returning advice
,在业务逻辑成功执行后引入切面After throwing advice
,在业务逻辑报异常时引入切面Around advice
,在业务逻辑执行前后都引入切面
weaving
,指的是将切面与目标对象关联起来,创建一个应用了切面的对象(an advised object)的过程。
有各种不同的weaving方式:
- complie-time,编译时进行
- load-time,加载时进行
- run-time,运行时进行
- 优点
- 比AspectJ使用起来简单
- 使用代理模式
- 可通过@Aspect注解移植到AspectJ上
- 缺点
- 仅支持方法级别的joint point
- 仅能用于Spring容器里创建的Bean
- 由于是运行时weaving,效率略低
- 优点
- 支持所有Join Point
- 可以在任何POJO内使用
- 比Spring AOP执行效率高
- 是一个完整的AOP支持
- 缺点
- 编译时weaving需要额外的编译步骤
- 切点语法复杂
- Spring.io上的文档和示例。
- Manning出版社的AspectJ in Action, Second Edition
- Aspect-Oriented Software Development with Use Cases
- 创建Aspects
- 各种方式部署Aspects:
- Before advice
- After returning
- After throwing
- After finally
- Around
- 切点表达式
- 将切点实际应用到 Spring + Hibernate 的项目中