AOP

Aspect Orientied Programming 面向切面编程(面向方面编程)
它其实是对面向对象思想的一个扩展
它可以在不修改原有组件 源代码的情况下 给组件增强功能

AOP 关注重点是切面 通过配置手段就可以将切面嵌入到合适的位置
这样 能实现组件的重复利用 解除切面和目标组件之间的耦合度 大大提供程序的灵活性和可扩展性

AOP 中涉及到的概念

Aspect       切面        切面是用来封装共通业务逻辑的   用切面类型创建的对象叫切面对象
JoinPoint    连接点      要被加入共通业务的位置   一般封装了方法的信息
Pointcut     切点        切点是一堆连接点的集合  
Target       目标        要被切入共通业务逻辑的组件 
Proxy        代理        被增强之后的目标 叫代理  
Advice       通知        通知是一种时机   目标方法调用开始之前   目标方法调用之后 
目标方法调用前后    目标方法执行过程中一定执行    目标方法出现异常

简单总结: 切面 – 通知 – 切点

AOP 编程的实现步骤

  1. 建立一个项目 导入jar包(ioc aop) 拷贝配置文件到src下
    建立一个服务类 里面定义两个方法 使用伪代码完成逻辑 使用Spring 容器创建
    组件 并通过容器获取组件 调用方法
  2. 定义一个切面类 共通业务逻辑是 在方法调用前打印
  3. 在Spring 容器中创建切面对象 并且通过配置手段 将切面嵌入到方法调用位置 测试
  4. 写一个DAO 接口 ,写一个DAO 接口的实现类 实现类的代码
    在Spring 容器中创建DAO 接口的实现类对象
    并通过容器获取这个对象 调用上面的方法。 然后写一个切面类 里面定义一个方法 这个
    方法可以打印系统时间 格式 yyyy-MM-dd hh:mm:ss@1970到现在的毫秒数
    然后通过AOP的手段 将系统时间打印嵌入到 上面的DAO 方法中。

切点表达式的写法

  1. bean 限定表达式
    bean(符合条件的对象id) 如果符合对象的id 则对象对应的类型中对应 所有的方法都将切入共通逻辑
    允许使用通配符 如 *Dao 既所有的以Dao 结尾的组件id 都将被匹配
  2. 类型限定表达式
    within(符合条件的类型表达式) 这个表达式的最后一部分一定是类型
  3. 方法限定表达式
    execution(方法限定表达式) 方法限定表达式 包括
    权限修饰     返回值类型   方法名(参数说明) throws 异常   
    其中 返回值类 方法名() 是必须的

Spring AOP 中的五种通知类型

<aop:before            前置通知   在目标方法调用前调用 
<aop:after             最终通知   在目标方法调用后 一定会调用
<aop:after-returing   后置通知   在目标方法调用后 调用   目标方法出现异常就不调用 
<aop:after-throwing   异常通知   在目标方法出现异常时调用 
<aop:around              环绕通知   在目标方法调用前后 都会调用 

基于标注的AOP

  1. 建立一个项目 导入jar包(ioc aop) 拷贝配置文件到src下
  2. 开启组件扫描
    <context:component-scan base-package=”” />
  3. 写一个 DAO 接口
  4. 写一个DAO 的实现类
  5. 在DAO 实现类上加对应的标注 让其在容器中创建对象 测试
  6. 写一个切面组件 并在容器中创建对象
  7. 开启标注形式的 aop
    <aop:aspectj-autoproxy proxy-target-class=”true” />
  8. 在切面类上加 把切面类 变成真正的切面的标注 @Aspect
    在切面方法上加对应的通知标注 然后在标注中写切点表达式

Spring 中的通知对应的标注

<aop:before            前置通知   在目标方法调用前调用      @Before
<aop:after             最终通知   在目标方法调用后 一定会调用  @After
<aop:after-returning  后置通知   在目标方法调用后 调用   目标方法出现异常就不调用 @AfterReturning
<aop:after-throwing   异常通知   在目标方法出现异常时调用  @AfterThrowing
<aop:around              环绕通知   在目标方法调用前后 都会调用   @Around  


11月      Java

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!