类的关系
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:}
p s : 调用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(二)