美文网首页
Spring-IOC

Spring-IOC

作者: 七层茅草屋 | 来源:发表于2019-12-08 16:21 被阅读0次

在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定义。

相关文章

网友评论

      本文标题:Spring-IOC

      本文链接:https://www.haomeiwen.com/subject/fitpgctx.html