springbean的实例化过程
2020-07-28 10:04:26 0 举报
springbean实例化过程
作者其他创作
大纲/内容
循环调用class
AtBefore
给创建的bean进行赋值
singletonObject = singletonFactory.getObject();
返回AspectJMethodBeforeAdvice
mbd.getInitMethodName()
getAdvicesAndAdvisorsForBean
在构造函数上标识了@Autowired的注入方法 调用构造方法来创建
调用
不是
initializeBean()
具体beanType判断是不是切面类
getObjectForBeanInstance()
InitializingBean.afterPropertiesSet()
canApply
AbstractAutoProxyCreator#postProcessAfterInitialization
调用无参的构造器来创建对象
calculate组件就是一个代理对象
BeanFactoryUtils#beanNamesForTypeIncludingAncestors
invokeAwareMethods()
<bean abstract=\"true\"> 不被spring容器管理
2:从候选的跳出能用的
AtPointcut
advisorFactory.isAspect(beanType)
返回AspectJAfterReturningAdvice
AbstractAutowireCapableBeanFactory#createBean()
获取切面类上所有的方法(排除我们@PointCut标注的方法),并且循环获取通知
beforeSingletonCreation
DefaultSingletonBeanRegistry.addSingletonFactory()
AbstractApplicationContext.getBean()
getPointcut
Y:方法上没有上述的注解,表示该方法不是我们要找的切面方法
返回实例化好的intaB
返回AspectJAfterThrowingAdvice
当前增强器满足,直接加入到集合中
checkMergedBeanDefinition
N
AbstractBeanFactory.doGetBean()
bean的后续处理
this.advisorsCache.get(aspectName);
getMergedLocalBeanDefinition()
specificInterceptors!=null
返回null
自定义的初始化方法
doCreateBean()
beanNamesForTypeIncludingAncestors
introductionAwareMethodMatcher.matches
通过工厂方法来创建Bean实例 @Bean的形式配置的
beanFactory.getType(beanName);
第一步:从方法上获取切点表达式
第二步从缓存中获取增强器创建代理对象
N判断类是不是切面
wrapIfNecessary
去类级缓存字段上获取
创建代理工厂proxyFactory
第一步:找到候选的增强器(advisors)
作为参数传入
就是在这里给后置处理器一个机会来返回代理对象,但是在这里并没有创建代理对象,仅仅是把切面信息解析出来缓存好
DefaultSingletonBeanRegistry.getSingleton()
2:判断是否需要创建代理对象
通过beanName获取beanType
循环匹配方法
shouldSkip
实例化切面
aspectBeanNames!=null
0
BeanFactoryAspectJAdvisorsBuilder#buildAspectJAdvisors
调用XXAware接口
当前的bean已经创建好了 把当前的bean给从singletonsCurrentlyInCreation移除掉
把创建好的对象放进到缓存池,情况二三级缓存
设置代理工厂使用jdk代还是cglib代理
instantiateUsingFactoryMethod
getSingleton()
获取通知
调用bean的后置处理器进行对处理
早期对象instA=instA@12345
循环所有的候选增强器
pc.getMethodMatcher();
instantiateAdvice
获取父工厂
findCandidateAdvisors
实现
直接返回bean
AtAround
校验当前的bean定义,若当前的bean定义是abstract的话直接抛出异常
afterSingletonCreation
因为@EnableAspectJAutoProxy导入了AnnotationAwareAspectJAutoProxyCreator
1:找到候选的
抛出异常
创建代理对象getProxy
找到了
resolveBeforeInstantiation()
把刚刚创建好的对象 属性还没有赋值的对象通过ObjectFactory的形式加入到缓存中,用来解决循环依赖
创建Bean的流程
ReflectiveAspectJAdvisorFactory#getAdvisors
1)判断当前类是PointCut Advisor advice AopInfrastructureBean2)当前类是切面类
返回AspectJAroundAdvice
返回原始对象A
继承
applyBeanPostProcessorsBeforeInitialization()
findEligibleAdvisors
isAspect(candidateAspectClass)
判断容器中是否有InstantiationAwareBeanPostProcessors
DefaultSingletonBeanRegistry.addSingleton()
findAspectJAnnotationOnMethod
advisorNames.length == 0
核心逻辑就是看当前类上有没有标注了@AspectJ注解
populateBean()
1:getBean(instB)
去实例化instA
没找到直接返回空的集合
获取容器中所有组件的名称
事物源码,是在这里找到了
AbstractAutoProxyCreator#postProcessBeforeInstantiation
spring循环依赖数据流程图
getBean(instA)
getAdvisor
把方法拦截器转为增强器buildAdvisors
springbean的实例化过程
advisorNames!=null
调用子类的AspectJAwareAdvisorAutoProxyCreator
findCandidateAdvisors()
判断我们增强器是否实现了PointcutAdvisor接口
返回bean
3:把找到的增强器加到集合中返回
获取切面类和切面名称
返回实例化好的instA
AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization
通过advisorRetrievalHelper 切面查找工具查询增强器
findAdvisorsThatCanApply
根据Bean定义的scope来创建Bean
buildAspectJAdvisors
invokeInitMethods()
transformedBeanName()
获取当前类以及父接口
把切面类作为key,找到的增强器集合作为value ,存入缓存中
1:获取切面类
InstantiationModelAwarePointcutAdvisorImpl
第一步获取切面类创建增强器到缓存中
AbstractAutoProxyCreator
findAdvisorBeans
早期对象instB=instB@12345
ReflectiveAspectJAdvisorFactory#getAdvice
代理的前置判断
AtAfter
调用InitializingBean的方法
动态代理aop
canApply真正的匹配
循环依赖抛异常
AtAfterThrowing
getParentBeanFactory()
Y
1:getBean(instA)
本类直接返回false
AbstractBeanFactory.getObjectForBeanInstance()
isPrototypeCurrentlyInCreation()
autowireConstructor
是:获取增强器
getAdvisorMethods
aspectInstanceFactory.getAspectMetadata().getAspectClass();
创建Advisor的实现类
通过class获取所有的方法
isInfrastructureClass(beanClass)
AopUtils.findAdvisorsThatCanApply
aspectJAnnotation==null
expressionPointcut!=null
判断是否解析过aspectNames==null
判断原型bean的依赖注入
super.findCandidateAdvisors();
通过ObjeccFacotry.getObject()方法触发createBean的流程
循环所有的BeanName
@dependsOn
InstantiationAwareBeanPostProcessor接口
Y:从缓存中获取直接返回
返回
对象的初始化方法
AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInstantiation
advisors.addAll()
真正创建bean逻辑
sharedInstance=null
Bean的后续处理
cachedAdvisorBeanNames
标识当前创建对象放入到一个标识singletonsCurrentlyInCreation对象中
获取方法匹配器
switch (aspectJAnnotation.getAnnotationType())
createBeanInstance()
instantiateBean
2:找到方法上的注解
对bean进行初始化
收藏
0 条评论
下一页