Spring|Spring AOP三种配置详细介绍

AOP框架三足鼎立:
1. AspectJ
2.Jboss AOP
3.SpringAOP

Spring提供4中AOP支持
1.基于代理的经典AOP
2.纯POJO切面(使用XML)
3.@AspcetJ注解驱动的切面
4.注入式AspcetJ切面


我们需要代理的类:
Spring|Spring AOP三种配置详细介绍
文章图片



(一)经典aop
通知:advice
日志、数据库连接等这些公共功能的代码(切面---à多个类的交叉的功能)
Spring中提供:前置通知环绕通知后置通知异常通知引入通知
(接口)
MethodBeforeAdviceMethodInteceptorAfterReturningAdviceThrowsAdvice
其中引入通知是通过配置的,实现自定义切入点,和上述四个通知配合使用
以MethodBeforeAdvice为例


Spring|Spring AOP三种配置详细介绍
文章图片





通知可以获得代理的方法和对象和参数,可以对它进行相关处理或过滤
Spring|Spring AOP三种配置详细介绍
文章图片




代理对象:ProxyFactoryBean这是Spring框架提供出来的,我们直接使用,并配置相关属性
通过配置这个代理对象代理一个或多个接口还有实际代理的目标对象然后把通知织入代理对象,通过配置将他们关联起来。
Spring|Spring AOP三种配置详细介绍
文章图片




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

Spring|Spring AOP三种配置详细介绍
文章图片



ProxyFactoryBean源码中:
我们刚刚配置的
Spring|Spring AOP三种配置详细介绍
文章图片




尽管ProxyFactoryBean中并没有proxyInterfaces这个属性, 但它有setProxyInterfaces()方法,还是会调用这个方法
Spring|Spring AOP三种配置详细介绍
文章图片




Spring|Spring AOP三种配置详细介绍
文章图片




Spring|Spring AOP三种配置详细介绍
文章图片




Spring|Spring AOP三种配置详细介绍
文章图片





上述是经典AOP
spring有一套经典AOPProxyFactoryBean笨重复杂
spring3.0新的AOP框架模型 精简易用

(二)XML声明切面
极大简化了spring切面的配置工作,同时也让程序透明化,隐藏了切面的很多细节。
至此上面所有内容都可以作为理解spring配置AOP的基础,是最原始的配置方式,也体现了spring处理的过程。
使用ProxyFactoryBean配置有些欠优雅,在spring2.0里新的xml配置元素体现了改进。Spring2.0在aop命名空间里提供了一些配置元素,简化了把类转化为切面的操作。

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

Spring|Spring AOP三种配置详细介绍
文章图片




完全pojo--->切面
Spring|Spring AOP三种配置详细介绍
文章图片





在XML中配置切面aspect为audience(使得audience成为切面)
切点
前置通知后置通知after-returning通知 环绕通知异常通知
不用再配置ProxyFactoryBean

测试成功:

Spring|Spring AOP三种配置详细介绍
文章图片




注意:
环绕通知需要使用ProceedingJoinPoint作为入参
通知可以传递参数可以校验方法的参数值
(三)注解切面
Aspect5引入的关键特性--à@AspcetJ,AspectJ切点表达式

通过注解使Audience类转换为切面
Spring|Spring AOP三种配置详细介绍
文章图片




这样就不需要在xml中进行转换了,不过要在spring的上下文中声明一个自动代理Bean
该bean知道如何把@AspcetJ注解的Bean转变成代理通知。
Spring|Spring AOP三种配置详细介绍
文章图片




Annotation都需要解析程序才有意义
一般框架里面提供给我们的注解框架本身会提供解析的程序
配置文件中是由AspectJAutoProxyBeanDefinitionParser解析
AspectJAutoProxyBeanDefinitionParser不是一个public类它的接口如下:
Spring|Spring AOP三种配置详细介绍
文章图片




查看其继承体系:
Spring|Spring AOP三种配置详细介绍
文章图片






AspectJAutoProxyBeanDefinitionParser源码:

Spring|Spring AOP三种配置详细介绍
文章图片








可以看出它是属于spring框架里面的。也就是说我们只是用了aspect的表达式而已,底层并没有使用aspect的技术
只用了aspcet的注解本身,注解本身是aspectj项目的
Spring|Spring AOP三种配置详细介绍
文章图片




(四)注入AspcetJ切面





Spring AOP原理

动态代理见动态代理文章


【Spring|Spring AOP三种配置详细介绍】

    推荐阅读