1.什么是AOP
Aspect Orientied Programming 面向切面编程(面向方面编程) 它其实是对面向对象思想的一个扩展 它可以在不修改原有组件 源代码的情况下 给组件增强功能 AOP 关注重点是切面 通过配置手段就可以将切面嵌入到合适的位置 这样 能实现组件的重复利用 解除切面和目标组件之间的耦合度 大大提供程序的灵活性和可扩展性
2、AOP 中涉及到的概念
Aspect 切面 切面是用来封装共通业务逻辑的 用切面类型创建的对象叫切面对象 JoinPoint 连接点 要被加入共通业务的位置 一般封装了方法的信息 Pointcut 切点 切点是一堆连接点的集合
Target 目标 要被切入共通业务逻辑的组件
Proxy 代理 被增强之后的目标 叫代理
Advice 通知 通知是一种时机 目标方法调用开始之前 目标方法调用之后 目标方法调用前后 目标方法执行过程中一定执行 目标方法出现异常
切面 ------ 通知 ------- 切点
3、AOP 编程的实现步骤
3.1 建立一个项目 导入jar包(ioc aop) 拷贝配置文件到src下 建立一个服务类 里面定义两个方法 使用伪代码完成逻辑 使用Spring 容器创建 组件 并通过容器获取组件 调用方法
3.2 定义一个切面类 共通业务逻辑是 在方法调用前打印
3.3 在Spring 容器中创建切面对象 并且通过配置手段 将切面嵌入到方法调用位置 测试
4、切点表达式的写法
4.1bean 限定表达式 bean(符合条件的对象id) 如果符合对象的id 则对象对应的类型中对应 所有的方法都将切入共通逻辑 允许使用通配符 如 *Dao 既所有的以Dao 结尾的组件id 都将被匹配
4.2 类型限定表达式
within(符合条件的类型表达式) 这个表达式的最后一部分一定是类型
within(com.xdl.dao.XdlBankAccountDAOOracleImp) com.xdl.dao中的 XdlBankAccountDAOOracleImp类型中对应的所有方法 都将被切入共通业务逻辑 within(com.xdl.dao.*) com.xdl.dao中的 所有的类型中对应的所有方法 都将被切入共通业务逻辑 *
within(com.xdl..*) com.xdl 包下的类型 以及 子包下类型 都将被切入共通业务逻辑
4.3 方法限定表达式
execution(方法限定表达式) 方法限定表达式 包括 权限修饰 返回值类型 方法名(参数说明) throws 异常 其中 返回值类 方法名() 是必须的
5.Spring AOP 中五种通知类型
<aop:before 前置通知 在目标方法调用前调用
<aop:after 最终通知 在目标方法调用后 一定会调用
<aop:after-returing 后置通知 在目标方法调用后 调用 目标方法出现异常就不调用
<aop:after-throwing 异常通知 在目标方法出现异常时调用
<aop:around 环绕通知 在目标方法调用前后 都会调用
6.基于标注的AOP
7.1 建立一个项目 导入jar包(ioc aop) 拷贝配置文件到src下
7.2 开启组件扫描 <context:component-scan base-package="" />
7.3 写一个 DAO 接口 复用上午的
7.4 写一个DAO 的实现类 复用上午的
7.5 在DAO 实现类上加对应的标注 让其在容器中创建对象 测试
7.6 写一个切面组件 并在容器中创建对象
7.7 开启标注形式的 aop <aop:aspectj-autoproxy proxy-target-class="true" />
7.8 在切面类上加 把切面类 变成真正的切面的标注 @Aspect 在切面方法上加对应的通知标注 然后在标注中写切点表达式
7.Spring 中的通知对应的标注
<aop:before 前置通知 在目标方法调用前调用 @Before
<aop:after 最终通知 在目标方法调用后 一定会调用 @After
<aop:after-returning 后置通知 在目标方法调用后 调用 目标方法出现异常就不调用 @AfterReturning
<aop:after-throwing 异常通知 在目标方法出现异常时调用 @AfterThrowing
<aop:around 环绕通知 在目标方法调用前后 都会调用 @Around