Spring-IOC

在Spring容器启动的时候,Spring会把你在application.xml中配置好的bean都初始化,需要调用的时 候,把初始化的Bean分配给你要调用的类,不用去手工创建一个对象的实例
一、 Bean的创建和获取
getBean-->处理BeanName-->从缓存中获取
有-->getObjectForBeanInstance-->是否工厂类getObjectFromFactoryBean-->返回Bean
没有-->进入创建bean逻辑-->加入缓存-->类型检测-->返回Bean

  1. AnnotationConfigApplicationContext 配置类初始化spring容器
    -->register(componentClasses) 注册配置类
    -->this.reader.register(componentClasses); 读取
    -->registerBean(componentClass);注册bean
    -->doRegisterBean(beanClass, null, null, null, null); 参数注入
    -->AnnotatedBeanDefinitionReader.doRegisterBean
    ·1. 通过读取@Configuration获取 new AnnotatedGenericBeanDefinition(beanClass);
    ·2. 判断是否跳过解析
if(this.conditionEvaluator.shouldSkip(abd.getMetadata())) { return; }
abd.setInstanceSupplier(supplier); 

·3. 得到作用域默认singleton

 ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd)

·4. 将类的作用域添加到数据结构中 ???

abd.setScope(scopeMetadata.getScopeName());    
String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry))

·5. 处理类当中的通用注解分析源码可以知道他主要处理 Lazy DependOn Primary Role等注解 处理完后 processCommonDefinitionAnnotations 依然是把他添加到数据结构当中去 ????
AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);

if (qualifiers != null) { 
  for (Class<? extends Annotation> qualifier : qualifiers) {            
    if (Primary.class == qualifier) {                
      abd.setPrimary(true);            
     } else if (Lazy.class == qualifier) { abd.setLazyInit(true); 
     } else {                
          abd.addQualifier(new AutowireCandidateQualifier(qualifier));           
      }        
    }    
} 
 //自定义注解
if (customizers != null) {
    for (BeanDefinitionCustomizer customizer : customizers) {
      customizer.customize(abd);       
     }    
}
    /**
     * 这个BeanDefinitionHolder也是一个数据结构    
     * 存放BeanDefinition     
    */   
     BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd,beanName);    
    definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);    
/**     
* 把上述这个数据结构注册给registry     
* registry就是AnnotationConfigApplicationContext     
*    
* */    
  BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry); 
}
  1. getBean获取bean
    1.getBeanFactory().getBean(name)
    2.doGetBean(name, ...) 判断是否&符号开头,是就用原生的,不是就用自定义
    判断是是不是singleton,多例,每次进来创建一个bean
    3.获取到bean的名字,从缓存获取,没有则创建
    BeanFactory parenBeanFactory = getParentBeanFactory();创建BeanFactory
    4.先判断有没有父容器,必免重复创建
    5.根据名字获取Bean的定义
    RootBeanDedidnition mbd = getMergedLocalBeanDefifnition(beanName)
    6.checkMergeBeanDefinition(mbd, beanName,args) 初始化bean 的参数
    7.判断是否singleton
    createBean(beanName, mbd, args)

  2. CreateBean创建bean
    1.doCreateBean()
    2.BeanWrapper相当于代理器进行属性填充,属性注入依赖注入都通过它来完成
    3.GreateBeanInstance(beanName, mbd, args)获取bean的实例,通过反射获取
    4.初始化
    GenericBeanDefinition extends AbstractBeanDefinition
    是标准bean定义的一站式服务。像任何bean定义一样,它允许指定一个可选的类构造函数参数值和属性值。此外,由可以通过“parentName”属性灵活配置父bean定义。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 文/尹西林 昨天去看影片《芳华》,其中三个情节让我七十三岁的老兵在影院里当众失态,放声哭了起来: 一、越南地雷爆炸...
    尹西林阅读 567评论 0 3
  • 外面的雨一直下, 气氛似乎也变得, 不太融洽, 雨渐渐大的, 越来越模糊, 楓吹的那一天, 花落的那一天, 等待的...
    半江紅阅读 155评论 0 0
  • 《逍遥游》 战国•庄周 北冥(míng)有鱼,其名为鲲(kūn)。鲲之大,不知其几千里也;化而为鸟,其名为鹏。鹏之...
    弄青春阅读 19,470评论 4 16
  • 桶里有只老鳖奋斗了很久想要爬出来,已经有三天,第一天挠破了捕它用的网,第二天和第三天都没有什么进展,只听见它的爪子...
    AprilNo1阅读 436评论 0 1