AOP
Aspect Orientied Programming
面向切面编程(面向方面编程)
它其实是对面向对象思想的一个扩展
它可以在不修改原有组件 源代码的情况下 给组件增强功能
AOP 关注重点是切面 通过配置手段就可以将切面嵌入到合适的位置
这样 能实现组件的重复利用 解除切面和目标组件之间的耦合度 大大提供程序的灵活性和可扩展性
AOP 中涉及到的概念
Aspect 切面 切面是用来封装共通业务逻辑的 用切面类型创建的对象叫切面对象
JoinPoint 连接点 要被加入共通业务的位置 一般封装了方法的信息
Pointcut 切点 切点是一堆连接点的集合
Target 目标 要被切入共通业务逻辑的组件
Proxy 代理 被增强之后的目标 叫代理
Advice 通知 通知是一种时机 目标方法调用开始之前 目标方法调用之后
目标方法调用前后 目标方法执行过程中一定执行 目标方法出现异常
简单总结: 切面 – 通知 – 切点
AOP 编程的实现步骤
- 建立一个项目 导入jar包(ioc aop) 拷贝配置文件到src下
建立一个服务类 里面定义两个方法 使用伪代码完成逻辑 使用Spring 容器创建
组件 并通过容器获取组件 调用方法 - 定义一个切面类 共通业务逻辑是 在方法调用前打印
- 在Spring 容器中创建切面对象 并且通过配置手段 将切面嵌入到方法调用位置 测试
- 写一个DAO 接口 ,写一个DAO 接口的实现类 实现类的代码
在Spring 容器中创建DAO 接口的实现类对象
并通过容器获取这个对象 调用上面的方法。 然后写一个切面类 里面定义一个方法 这个
方法可以打印系统时间 格式 yyyy-MM-dd hh:mm:ss@1970到现在的毫秒数
然后通过AOP的手段 将系统时间打印嵌入到 上面的DAO 方法中。
切点表达式的写法
- bean 限定表达式
bean(符合条件的对象id)
如果符合对象的id 则对象对应的类型中对应 所有的方法都将切入共通逻辑
允许使用通配符 如 *Dao 既所有的以Dao 结尾的组件id 都将被匹配 - 类型限定表达式
within(符合条件的类型表达式)
这个表达式的最后一部分一定是类型 - 方法限定表达式
execution(方法限定表达式)
方法限定表达式 包括
其中 返回值类 方法名() 是必须的权限修饰 返回值类型 方法名(参数说明) throws 异常
Spring AOP 中的五种通知类型
<aop:before 前置通知 在目标方法调用前调用
<aop:after 最终通知 在目标方法调用后 一定会调用
<aop:after-returing 后置通知 在目标方法调用后 调用 目标方法出现异常就不调用
<aop:after-throwing 异常通知 在目标方法出现异常时调用
<aop:around 环绕通知 在目标方法调用前后 都会调用
基于标注的AOP
- 建立一个项目 导入jar包(ioc aop) 拷贝配置文件到src下
- 开启组件扫描
<context:component-scan base-package=”” /> - 写一个 DAO 接口
- 写一个DAO 的实现类
- 在DAO 实现类上加对应的标注 让其在容器中创建对象 测试
- 写一个切面组件 并在容器中创建对象
- 开启标注形式的 aop
<aop:aspectj-autoproxy proxy-target-class=”true” /> - 在切面类上加 把切面类 变成真正的切面的标注 @Aspect
在切面方法上加对应的通知标注 然后在标注中写切点表达式
Spring 中的通知对应的标注
<aop:before 前置通知 在目标方法调用前调用 @Before
<aop:after 最终通知 在目标方法调用后 一定会调用 @After
<aop:after-returning 后置通知 在目标方法调用后 调用 目标方法出现异常就不调用 @AfterReturning
<aop:after-throwing 异常通知 在目标方法出现异常时调用 @AfterThrowing
<aop:around 环绕通知 在目标方法调用前后 都会调用 @Around
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!