Sping AOP概述
实现机制
Spring实现AOP是动态代理的方式。在Spring运行的时候,会针对目标Bean动态的产生一个代理的Bean,而调用者真正来使用的时候并不是直接访问目标Bean,而是使用的代理Bean
注意点
-
代理Bean使用ProxyFactory产生
这是使用编程或者Xml配置时,重点要使用的一个类,它是实现SpringAOP的关键的类。从名字也可以看出来它是一个代理工厂类。 - 内部根据情况使用不同的代理实现
-
代理Bean注入到调用者中供使用
这是Spring的一贯风格
两种代理实现
代理在Java里面至少有两种,一种是JDK的代理,一种是开源包实现的代理
看上图,JDK的代理要求被代理的目标实现接口,CGLIB的代理不需要目标Bean实现任何的接口。因此,如果目标Bean实现了接口,上面两种方式都是可行的;如果目标Bean并没有实现任何接口,那只能考虑使用CGLIB。
如果从性能上考虑的话,JDK一般比CGLIB性能高一些。
连接点的类型
连接点用于表明通知用在哪个地方,Spring里面目前只支持一种连接点类型——方法调用。也就是说我们写的通知只有在方法调用这样的场景上可以用上,其他场景应用不上。
不过,在一些特定的场景下,连接点并不是方法调用的话,也可以集成功能更加强大的AspectJ,它提供了更多类型的连接点的支持。
通知类型
看上图,列出了通知的各种类型,在调用方法之前有Before,调用方法之后有After,方法运行前后都可以使用的Around。After分为两种:After Returning、After Throwing。
实现方式
以下是Spring支持的AOP实现方式:
-
使用ProxyFactory
使用纯Java代码来使用编程式的写法,最核心的一个类是ProxyFactory -
配置ProxyFactoryBean
使用Xml来配置一个ProxyFactoryBean -
使用AOP的命名空间
目前用的比较流行 - 使用AspectJ的注解