Spring|Spring AOP三种配置详细介绍
AOP框架三足鼎立:
1. AspectJ
2.Jboss AOP
3.SpringAOP
Spring提供4中AOP支持
1.基于代理的经典AOP
2.纯POJO切面(使用XML)
3.@AspcetJ注解驱动的切面
4.注入式AspcetJ切面
我们需要代理的类:
文章图片
(一)经典aop
通知:advice
日志、数据库连接等这些公共功能的代码(切面---à多个类的交叉的功能)
Spring中提供:前置通知环绕通知后置通知异常通知引入通知
(接口)
MethodBeforeAdviceMethodInteceptorAfterReturningAdviceThrowsAdvice
其中引入通知是通过配置的,实现自定义切入点,和上述四个通知配合使用
以MethodBeforeAdvice为例
文章图片
通知可以获得代理的方法和对象和参数,可以对它进行相关处理或过滤
文章图片
代理对象:ProxyFactoryBean这是Spring框架提供出来的,我们直接使用,并配置相关属性
通过配置这个代理对象代理一个或多个接口还有实际代理的目标对象然后把通知织入代理对象,通过配置将他们关联起来。
文章图片
使用:取得代理对象,转为被代理类的接口(IApp)即可。所以方法都会被代理
文章图片
ProxyFactoryBean源码中:
我们刚刚配置的
文章图片
尽管ProxyFactoryBean中并没有proxyInterfaces这个属性, 但它有setProxyInterfaces()方法,还是会调用这个方法
文章图片
文章图片
文章图片
文章图片
上述是经典AOP
spring有一套经典AOPProxyFactoryBean笨重复杂
spring3.0新的AOP框架模型 精简易用
(二)XML声明切面
极大简化了spring切面的配置工作,同时也让程序透明化,隐藏了切面的很多细节。
至此上面所有内容都可以作为理解spring配置AOP的基础,是最原始的配置方式,也体现了spring处理的过程。
使用ProxyFactoryBean配置有些欠优雅,在spring2.0里新的xml配置元素体现了改进。Spring2.0在aop命名空间里提供了一些配置元素,简化了把类转化为切面的操作。
(本质的使用同上,只是简化配置,隐藏细节)
文章图片
完全pojo--->切面
文章图片
在XML中配置切面aspect为audience(使得audience成为切面)
切点
前置通知后置通知after-returning通知 环绕通知异常通知
不用再配置ProxyFactoryBean
测试成功:
文章图片
注意:
环绕通知需要使用ProceedingJoinPoint作为入参
通知可以传递参数可以校验方法的参数值
(三)注解切面
Aspect5引入的关键特性--à@AspcetJ,AspectJ切点表达式
通过注解使Audience类转换为切面
文章图片
这样就不需要在xml中进行转换了,不过要在spring的上下文中声明一个自动代理Bean
该bean知道如何把@AspcetJ注解的Bean转变成代理通知。
文章图片
Annotation都需要解析程序才有意义
一般框架里面提供给我们的注解框架本身会提供解析的程序
配置文件中是由AspectJAutoProxyBeanDefinitionParser解析
AspectJAutoProxyBeanDefinitionParser不是一个public类它的接口如下:
文章图片
查看其继承体系:
文章图片
AspectJAutoProxyBeanDefinitionParser源码:
文章图片
可以看出它是属于spring框架里面的。也就是说我们只是用了aspect的表达式而已,底层并没有使用aspect的技术
只用了aspcet的注解本身,注解本身是aspectj项目的
文章图片
(四)注入AspcetJ切面
略
Spring AOP原理
动态代理见动态代理文章
【Spring|Spring AOP三种配置详细介绍】
推荐阅读
- 由浅入深理解AOP
- Activiti(一)SpringBoot2集成Activiti6
- SpringBoot调用公共模块的自定义注解失效的解决
- 解决SpringBoot引用别的模块无法注入的问题
- 2018-07-09|2018-07-09 Spring 的DBCP,c3p0
- spring|spring boot项目启动websocket
- Spring|Spring Boot 整合 Activiti6.0.0
- Spring集成|Spring集成 Mina
- springboot使用redis缓存
- Spring|Spring 框架之 AOP 原理剖析已经出炉!!!预定的童鞋可以识别下发二维码去看了