图解springAop源码

类的关系图解springAop源码

AbstractAutowireCapableBeanFactory SmartInstantiationAwareBeanPostProcessor BeanPostProcessor InstantiationAwareBeanPostProcessor 当前bean是否允许依赖循环,提前暴露bean的ObjectFactory引用 遍历所有实现SmartInstantiationAwareBeanPostProcessor接口后置处理器 获取对指定bean的早期访问的引用,通常用于解析循环引用。getEarlyBeanReference(Object bean, String beanName) 把getEarlyBeanReference返回的设置到ObjectFactory三级缓存里面 实例化bean之前 遍历所有的InstantiationAwareBeanPostProcessor接口实现类的后置处理器 给个机会后置的bean对象 ,改bean对象已经填充完bean属性了,beanpostProcessBeforeInstantiation(Class<?> beanClass, String beanName) 返回处理的bean对象 如果处理结果为null直接跳过,否则认为bean已经实例化成功,并且调用bean的后置处理器的方法applyBeanPostProcessorsAfterInitialization(bean, beanName) 常规实例化bean 填充bean属性 bean实例化完成 遍历所有的InstantiationAwareBeanPostProcessor接口实现类的后置处理器 给个机会实例化完成的bean,postProcessBeforeInitialization(result, beanName) AbstractAutowireCapableBeanFactory SmartInstantiationAwareBeanPostProcessor BeanPostProcessor InstantiationAwareBeanPostProcessor bean的生命周期
AbstractAutowireCapableBeanFactory AbstractAutoProxyCreator 实例化bean之前 遍历所有的bean前置处理器,给个机会后置处理器自定义实例化,如果返回不为空,直接使用后置处理器返回的bean 调用前置处理器方法,postProcessBeforeInstantiation(Class<?> beanClass, String beanName) 如果是Pointcut,AdviceAopInfrastructureBean,Advisor,AopInfrastructureBean基本类,不做代理,isInfrastructureClass(beanClass, beanName) 如果是bean的类有注解@Aspect,不做代理shouldSkip(beanClass, beanName), 把加入不需要代理的bean加入缓存,advisedBeans.put(beanName,false) 如果该bean不需要代理,返回null,结束 获取自定义TargetSource,TargetSourcegetCustomTargetSource(beanClass, beanName) 获取不到自定义TargetSource,结束 获取TargetSource所有的advisor,getAdvicesAndAdvisorsForBean() 为TargetSource生成代理对象,createProxy(beanClass, beanName, specificInterceptors, targetSource) 把代理对象加入缓存,this.proxyTypes.put(cacheKey, proxy.getClass()) 返回代理对象 加入beanMap里面,替换当前bean对象为代理对象 AbstractAutowireCapableBeanFactory AbstractAutoProxyCreator 实例化bean之前返回代理对象流程

p s : \color{blue}{ps:} ps:调用postProcessBeforeInstantiation(Class<?> beanClass, String beanName)返回代理对象,代理类后面的属性是无法进行依赖注入的属性值。所以除了TargetSource这种自定义返回的bean实例,代理bean都是在实例化依赖注入之后生成代理对象的。

AbstractAutowireCapableBeanFactory AnnotationAwareAspectJAutoProxyCreator 实例化bean之后,已经填充完属性了 遍历所有的bean后置处理器 如果后置处理器返回的对象不为空,直接替换bean对象 为配置了切面的信息的代理bean,生成代理对象,AnnotationAwareAspectJAutoProxyCreator 为bean生成代理对象,wrapIfNecessary(),转时序图(调用 wrapIfNecessary主要流程) 返回生成的代理对象 加入beanMap里面,替换当前bean对象为代理对象 AbstractAutowireCapableBeanFactory AnnotationAwareAspectJAutoProxyCreator spring实例化bean后返回代理对象流程
AnnotationAwareAspectJAutoProxyCreator wrapIfNecessary方法 findEligibleAdvisors方法 findAdvisorsThatCanApply方法 如果有必要为bean,生成代理对象 检查bean是否需要跳过代理 利用postProcessBeforeInitialization缓存的map,如果不需要代理,返回null 查找当前beanFactory可用的advisor,转时序图(查询beanFactory所有的advisor) 根据advisor的表达式筛选当前可用advisor 对可用的Advisor列表进行排序 返回排序后的Advisor列表 如果Advisor列表不为空,advisedBeans缓存bean,标记true,证明该类被代理了。 根据Advisor列表为bean创建代理对象 返回代理对象 AnnotationAwareAspectJAutoProxyCreator wrapIfNecessary方法 findEligibleAdvisors方法 findAdvisorsThatCanApply方法 调用 wrapIfNecessary主要流程
AnnotationAwareAspectJAutoProxyCreator BeanFactoryAspectJAdvisorsBuilder AspectJAdvisorFactory 调用父类的findEligibleAdvisors查询xml可用配置的advisor。这里需要兼容xml配置。 调用buildAspectJAdvisors()查找注解配置的advisor 遍历当前BeanFactory所有bean 调用isAspect()判断是否切面配置类,如果包含注解@Aspect,直接返回true,否则为false 把切面bean加入缓存aspectNames中 解析切面bean的类的元数据 AnnotationAwareAspectJAutoProxyCreator BeanFactoryAspectJAdvisorsBuilder AspectJAdvisorFactory 注解切面查询bean可用的advisor(一)
BeanFactoryAspectJAdvisorsBuilder AspectJAdvisorFactory MetadataAwareAspectInstanceFactory ReflectiveAspectJAdvisorFactory 调用getAdvisors()获取Advisor列表 调用getAspectMetadata().getAspectClass()获取切面类class 调用validate()校验切面类的注解配置是否正确 遍历切面类所有方法,调用getAdvisor(),获取Advisor 调用getPointcut解析方法的注解(Pointcut.class, Around.class, Before.class, After.class, AfterReturning.class, AfterThrowing.class),构建AspectJExpressionPointcut对象 通过AspectJExpressionPointcut对象构建InstantiationModelAwarePointcutAdvisorImpl,该对象继承PointcutAdvisor 把PointcutAdvisor加入AdvisorList 返回Advisor列表 BeanFactoryAspectJAdvisorsBuilder AspectJAdvisorFactory MetadataAwareAspectInstanceFactory ReflectiveAspectJAdvisorFactory 查询bean可用的advisor(二)