Spring AOP 是一个简化版的AOP 实现,并没有提供完整的AOP功能,通常情况下,Spring AOP 是能够满足我们日常开发过程中的大多数场景的,但在某些情况下, 我们可能需要使用Spring AOP 范围外的某些AOP 功能。
AspectJ是一个基于java语言的全功能的AOP框架,它并不是Spring组成部分,是一款独立的AOP框架。AspectJ框架为AOP 开发提供了一套@AspectJ注解,它允许我们直接在java类中通过注解的方式对切面(Aspect)、切入点(PointCut)和增强(Advice)进行定义,Spring框架可以根据这些注解生成AOP 代理。
在Spring的XML配置文件中,可以通过添加以下内容启动@AspectJ注解支持。
<!--开启注解扫描-->
<context:component-scan base-package="com.th.aop.annoaspectJ"></context:component-scan>
<!--开启AspectJ自动代理-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
在Spring 源码中进行检索,在AopNamespaceHandler 定义了个init()方法对"aspectj-autoproxy"标签进行了处理,源码如下:
从源码可知,在解析配置文件的时候,一旦遇到aspectj-autoproxy时就会使用解析器AspectJAutoProxyBeanDefinitionParser进行解析,
因为是对BeanDefinitionParse接口进行统一实现,所有入口均从parse()方法开始,源码如下
从代码中可知registerAspectJAnnotationAutoProxyCreatorIfNecessary()方法是核心逻辑处理代码,此方法主要完成三件事:
① 注册或升级AnnotationAwareAspectJAutoProxyCreator
AOP的实现基本上都是靠AnnotationAwareAspectJAutoProxyCreator来完成,它可以根据@Point 注解定义的切点来自动代理相匹配的bean.为了配置简单,Spring 使用了自定义配置来帮助我们自动注册AnnotationAwareAspectJAutoProxyCreator,其注册实现过程源代码如下:
②对于proxy-target-class 以及expose-proxy 属性的处理
useClassProxyingIfNecessary 实现了proxy-target-class属性以及expose-proxy属性的处理.源码如下:
③ 注册组件并通知,便于监听器做进一步处理,