Spring AOP三种配置详细介绍

AOP框架三足鼎立:

1. AspectJ

2.Jboss AOP

3.Spring  AOP

 

Spring提供4中AOP支持

1.基于代理的经典AOP

2.纯POJO切面(使用XML)

3.@AspcetJ注解驱动的切面

4.注入式AspcetJ切面

 

 

我们需要代理的类:


(一)经典aop

通知:advice

日志、数据库连接等这些公共功能的代码   (切面---à多个类的交叉的功能)

Spring中提供:前置通知     环绕通知     后置通知     异常通知  引入通知

 (接口)

MethodBeforeAdvice   MethodInteceptor  AfterReturningAdvice   ThrowsAdvice

其中引入通知是通过配置的,实现自定义切入点,和上述四个通知配合使用

以MethodBeforeAdvice为例




通知可以获得代理的方法和对象和参数,可以对它进行相关处理或过滤



代理对象:ProxyFactoryBean  这是Spring框架提供出来的,我们直接使用,并配置相关属性

通过配置  这个代理对象代理一个或多个接口   还有实际代理的目标对象  然后把通知织入代理对象  ,通过配置  将他们关联起来。



使用:取得代理对象,转为被代理类的接口(IApp)即可。所以方法都会被代理



ProxyFactoryBean源码中:

我们刚刚配置的



尽管ProxyFactoryBean中并没有proxyInterfaces这个属性, 但它有setProxyInterfaces()方法,还是会调用这个方法









上述是经典AOP

spring有一套经典AOPProxyFactoryBean笨重复杂

spring3.0新的AOP框架模型 精简易用

 

(二)XML声明切面

极大简化了spring切面的配置工作,同时也让程序透明化,隐藏了切面的很多细节。

至此上面所有内容都可以作为理解spring配置AOP的基础,是最原始的配置方式,也体现了spring处理的过程

使用ProxyFactoryBean配置有些欠优雅,在spring2.0里新的xml配置元素体现了改进。Spring2.0aop命名空间里提供了一些配置元素,简化了把类转化为切面的操作。

 

本质的使用同上,只是简化配置,隐藏细节




完全pojo--->切面



在XML中配置切面aspect为audience(使得audience成为切面)

             切点

             前置通知  后置通知  after-returning通知 环绕通知  异常通知

不用再配置ProxyFactoryBean

 

测试成功:




注意:

环绕通知需要使用ProceedingJoinPoint作为入参

通知可以传递参数  可以校验方法的参数值

(三)注解切面

Aspect5引入的关键特性--à@AspcetJ,AspectJ切点表达式

 

通过注解使Audience类转换为切面



这样就不需要在xml中进行转换了,不过要在spring的上下文中声明一个自动代理Bean

该bean知道如何把@AspcetJ注解的Bean转变成代理通知。



Annotation都需要解析程序才有意义

一般框架里面提供给我们的注解  框架本身会提供解析的程序

配置文件中<aop:aspectj-autoproxy/>是由AspectJAutoProxyBeanDefinitionParser解析

AspectJAutoProxyBeanDefinitionParser不是一个public类  它的接口如下:



查看其继承体系:




AspectJAutoProxyBeanDefinitionParser源码:





可以看出它是属于spring框架里面的。也就是说我们只是用了aspect的表达式而已,底层并没有使用aspect的技术

只用了aspcet的注解本身,注解本身是aspectj项目的



(四)注入AspcetJ切面



Spring AOP原理


动态代理  见动态代理文章



猜你喜欢

转载自blog.csdn.net/silviakafka/article/details/46931857