IOC源码解析笔记:
1.<constructor-arg name="A" ref = ""></constructor-arg>
2.构造方法注入:在createBeanInstance方法中调用,注册单例池在其同一方法 doCreateBean 的后几步操作,晚了一步,
多例为什么不行,构造器为什么不行,
核心:IOC的循环依赖
3.mbd.getResolvedAutowiredModel() 判断使用的转配模型,byName,byType;
PropertyValues pvs = mbd.getProertyValues();
pvs; MutablePropertyValues 对 pvs进行包装; resolveValueIfNecessary
bw.setPropertyValues()进行赋值;
5.byType: getCustomTypeConverter() 获取自定义转换器
6.@Bean(autowire = Autowire.BY_TYPE) 和 @Bean(autowire = Autowire.BY_NAME) 源码解析流程
AnnotationCondigAppLicationCOntext:-->refresh();-->findBeanFactoryInitialization()-->getBean()-->AbstractApplicationContenxt()--getBean--->getBeanFactory().getBean():
doGetBean()-->createBean()-->doCreateBean(){:
--> 1.this.createBeanInstance(beanName,mbd,args)
--> 2.populateBean(){
--> 1.mbd.getResolvedAutowireModel() == 1 --> this.autowireByName(beanName,mbd,bw,newPvs
-->this.registerDepedentBean(propertyName,beanName)[注册映射信息]
--> 2.mbd.getResolvedAutowireModel() == 2 --> this.autowireByType(beanName,mbd,bw,newPvs)
resolveDependency(desc,beanName,autowiredBeanNames,converter);{-->doResolveDependency(){
--> 1.getAutowireCandidateResolver().getSuggestedValue(descriptor)[解析@Value()注解
--> 2.findAutowireCandidates(beanName,type,descriptor)--[寻找注入的bean,matchingBeas.size>1判断]
--> 3.applyPropertyValues(beanNme,mbd,bw,pvs){bw.setPropertyValues() [赋值属性信息]