AOP思想与开发

   AOP思想

1.从OOP到AOP

在开发中,为了给业务方法增加日志记录、权限检查、事务控制等功能,此时我们需要去修改业务方法代码,考虑到代码的复用性。

我们可以考虑使用OOP的继承和组合来消除重复,但是无论怎么样,我们都会在业务方法中纵向地增加这些功能方法的调用代码。

此时,既不遵循开闭原则,也为后期系统的维护带来很大的麻烦

这些零散存在于业务方法中的功能代码,我们称之为横切面关注点,横切面关注点不属于业务范围,应该从业务代码中剥离出来。

为了解决该问题,OOP思想肯定是不行了,要使用AOP思想。

AOP  (Aspect Oritention Programming)--把一个个的横切关注点放到某个模块中去,称之为切面。那么每一个的切面都能影响业务的某一种功能,切面的目的就是功能增强,如日志切面就是一个横切关注点,应用中许多方法需要日志记录的只需要插入日志的切面即可。

这种面向切面编程的思想就是AOP思想了。

2.AOP术语

Joinpoint:连接点,被拦截到需要被增强的方法。where:去哪里做增强

Pointcut:切入点,哪些包中的哪些类中的哪些方法,可认为是连接点的集合。where:去哪些地方做增强

Advice:增强,当拦截到Joinpoint之后,在方法执行的什么时机(when)做什么样(what)的增强。根据时机分为:前置增强、后置增强、异常增强、最终增强、环绕增强

Aspect:切面,Pointcut+Advice,去哪些地方+在什么时机+做什么增强

Target:目标对象,被代理的目标对象

weaving:织入,把Advice加到Target上之后,创建出Proxy对象的过程

Proxy:一个类被AOP织入增强后,产生的代理类

Adivce(增强)执行时机:

3.Pointcut语法

AOP的规范应该由SUN公司提出,但是被AOP联盟捷足先登,AOP联盟捷足先登,AOP联盟在制定AOP规范时,首先就要解决一个问题--怎么表示切入点。也就是说怎么表达需要在哪些方法上做增强。这是一个如何表示WHERE的问题。

AOP规范知道后,面向切面编程的框架AspectJ也就应运而生了,同时也确定如何去表达这个WHERE.AspectJ切入点语法如下:

execution(<修饰符>?<返回类型><声明类型>?<方法名>(<参数>)<异常>?)

4.AOP开发

5.使用JDK动态代理(推荐)

默认是JDK动态代理方式,但也可以设置成CGLIB

6.各种时机的增强

        增强                         备注
aop:before(前置增强) 在方法执行之前执行增强
aop:after-returning(后置增强) 在方法正常执行完成执行增强(中间无异常)
aop:throwing(异常增强) 在方法抛出异常退出时执行增强
aop:after(最终增强) 在方法执行之后执行,相当于在finally里面执行,可以通过配置throwing来获得拦截到的异常信息
aop:around(环绕增强)

最强大的一种增强类型,环绕增强可以在方法调用前/后完成自定义的行为,环绕增强有两要求:

1.方法需要返回一个Object(返回的结果)

2.方法的第一个参数必须是ProceedingJointPoint(可以继续向下传递的连接点)

增强类型 应用场景
前置增强 权限控制、记录调用日志
后置增强 统计分析结果数据
异常增强 通过日志记录方法异常信息
最终增强 释放资源
环绕增强 缓存、性能日志、权限、事务管理

7.增强丰富参数配置

一,在增强方法中获取异常信息

xml配置:

<aop:after-throwing method="rollback" pointcut-ref="txPoint" throwing="ex"/>

java代码:

public void rollback(Throwable ex){
     system.out.println("回滚事务"+ex);
}

二,获取被增强方法信息,并传递给增强方法

JoinPoint:提供访问当前被增强方法的真实对象、代理对象、方法参数等。

ProceedingJoinPoint:JoinPoint子类,只用于环绕增强中,可以处理被增强方法

使用JoinPoint类:

使用ProceedingJoinPoint类:

注意:里面的异常抛出必须用Trowable类  ret承接被代理方法的返回值

8.注解配置

xml配置:

 

猜你喜欢

转载自blog.csdn.net/weixin_36328444/article/details/81322484