spring面向切面编程总结

AOP概念:

AOP(Aspect Oriented Programming面向切面编):指扩展功能不修改源代码,将功能代码从业务逻辑代码中分离出来

主要功能:日志记录,性能统计,安全控制,事务处理,异常处理等等。
主要意图:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。

AOP特点:

采用横向抽取机制,取代了传统纵向继承体系重复性代码。

AOP底层实现:

AOP底层使用动态代理实现。包括两种方式:

      (1)使用JDK动态代理实现。

      (2)使用cglib来实现

JDK动态代理实现:

只能对实现了接口的类生成代理,而不是针对类,该目标类型实现的接口都将被代理。原理是通过在运行期间创建一个接口的实现类来完成对目标对象的代理。步骤如下:
1. 定义一个实现接口InvocationHandler的类
2. 通过构造函数,注入被代理类
3. 实现invoke( Object proxy, Method method, Object[] args)方法
4. 在主函数中获得被代理类的类加载器
5. 使用Proxy.newProxyInstance( )产生一个代理对象
6. 通过代理对象调用各种方法

cglib动态代理实现:

针对类实现代理,对是否实现接口无要求。原理是对指定的类生成一个子类,覆盖其中的方法,因为是继承,所以被代理的类或方法最好不要声明为final类型。
1. 定义一个实现了MethodInterceptor接口的类
2. 实现其intercept()方法,在其中调用proxy.invokeSuper( )

代理方式的选择:

  1. 如果目标对象实现了接口,默认情况下回采用JDK的动态代理实现AOP,也可以强制使用cglib实现AOP
2. 如果目标对象没有实现接口,必须采用cglib库,Spring会自动在JDK动态代理和cglib之间转换
 

静态代理和动态代理的区别:

静态代理:自己编写创建代理类,然后再进行编译,在程序运行前,代理类的.class文件就已经存在了。
动态代理:在实现阶段不用关心代理谁,而在运行阶段(通过反射机制)才指定代理哪一个对象。

AOP 中包含许多新的概念与术语,说明如下:

切入点:在类里边可以有很多方法被增强,比如实际操作中,只是增强了个别方法,则定义实际被增强的某个方法为切入点。

通知/增强:增强的逻辑,称为增强,比如扩展日志功能,这个日志功能称为增强。包括:

前置通知:在方法之前执行

后置通知:在方法之后执行

异常通知:方法出现异常执行

最终通知:在后置之后执行

环绕通知:在方法之前和之后执行

切面:把增强应用到具体方法上面的过程称为切面。

通知:(Advice):

前置通知(Before):在某连接点之前执行的通知,它可以阻止连接点的执行。例如检查权限,决定是否执行连接点。

后置通知(AfterReturning):在某连接点正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回。它可以访问方法返回值。

异常通知(AfterThrowing):在方法抛出异常退出时执行的通知。它可以访问抛出的异常。

最终通知(After ):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。 这是传统spring AOP中没有的新的通知类型。它不能访问返回值或抛出的异常。可以用来执行释放资源,日志记录等操作。

环绕通知(Around):也叫方法拦截器。包围一个连接点的通知。这是最强大的一种通知类型。环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它自己的返回值或抛出异常来结束执行。 可用于实现性能测试,事物管理等。

前置通知(Before):

前置通知是在目标方法被调用之前织入的通知。即当目标方法被调用且执行之前,先执行的系统服务业务逻辑,如执行日志记录,参数检查,权限限制等

后置通知(AfterReturning):

后置通知是在目标方法调用之后织入通知,即在方法正常退出返回值之后且返回调用地点之前进行织入。

异常通知(AfterThrowing):

如果连接点抛出异常,异常通知(throws advice)将在连接点异常退出后被调用。

最终通知(After):

最终通知是无论目标方法异常退出,还是正常退出都一定会执行的通知

环绕通知(Around):

环绕 (Around)通知是最强大的通知类型,它能够代替之前所有通知类型,在连接点的前后执行,获取方法入参、返回值,捕捉并处理异常。下面我们就以性能测试为需求,针对业务层编写环绕通知,计算业务方法执行耗费的时间长短。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值