spring Bean定义流程图
2022-05-10 22:24:55   0  举报             
     
         
 spring中类是如何被扫描成bean定义的
    作者其他创作
 大纲/内容
 retrieveBeanMethodMetadata(sourceClass)
  2
  loadBeanDefinitionsFromImportedResources
  创建一个配置类解析器ConfigurationClassParser
  如果是Imported导入的一般类
  parser.parse(candidates);
  第二步:为容器中注册系统的bean定义信息
  注册一个配置类解析器的bean定义(ConfigurationClassPostProcessor)
  @PropertySource
  自己无参构造函数
  registerBeanDefinitionForImportedConfigurationClass
  92行:invokeBeanDefinitionRegistryPostProcessors
  @Bean
  默认扫描@Component  @Service @Repository @Controller @Aspectj 
  由于上面只是注册了@ComponentScan的定义,其他从这里注册
  this()
  org.springframework.context.support.GenericApplicationContext#registerBeanDefinition
  获取@bean的方法
  调用父类的无参构造函数
  从beanFactory中获取BeanDefinitionRegistryPostProcessor的定义信息
  this.includeFilters.add(new AnnotationTypeFilter(     ((Class<? extends Annotation>) ClassUtils.forName(\"javax.annotation.ManagedBean\
  添加beanDefinitions
  registerDefaultFilters()
  this.includeFilters.add(new AnnotationTypeFilter(Component.class));
  JSR-250
  4
  beanDefinitions.add(definitionHolder);
  processImports
  refresh
  递归走到
  org.springframework.context.annotation.ConfigurationClassPostProcessor#postProcessBeanDefinitionRegistry
  调用接口selector.selectImports(currentSourceClass.getMetadata());
  5
  创建一个条件计算器对象conditionEvaluator
  否
  开始
  判断是否需要创建一个IOC 容器
  校验是否解析完成alreadyParsed.addAll(configClasses);
  构造函数
  org.springframework.beans.factory.support.DefaultListableBeanFactory#registerBeanDefinition
  是
  register
  如果是@bean 方法
  scanner.doScan(StringUtils.toStringArray(basePackages))
  scanner
  注册自己传入的主配置类bean定义到容器中
  扫描bean定义
  org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcessors
  递归do while循环
  其他
  添加到主类的importBeanDefinitionRegistrars
  添加到主类的BeanMethod中
  入参为mainconfig
  结束
  this.reader.loadBeanDefinitions(configClasses);
  注意此时还没有注册bean定义信息
  3
  @Import
  注册包扫描默认的规则 
  JSR-330
  第一步
  @ComponentScan
  排序:sortPostProcessors
  如果是Imported引入ImportBeanDefinitionRegistrar
  初始化  this.reader = new AnnotatedBeanDefinitionReader(this);\t\tthis.scanner = new ClassPathBeanDefinitionScanner(this);
  loadBeanDefinitionsForBeanMethod
  如果是importResources
  doProcessConfigurationClass
  是否为ImportBeanDefinitionRegistrar
  1
  org.springframework.context.annotation.ConfigurationClassParser#processConfigurationClass
  调用内部方法
  注册解析@EventListener的注解
  reader
  While 循环
  AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry)
  过滤处理我们传入的主配置类
  org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanDefinitionRegistryPostProcessors
  是否为ImportSelector
  参数为ConfigurationClassPostProcessor的解析器
  AnnotationConfigApplicationContext
  调用接口方法
  第一步:初始化this.resourcePatternResolver = getResourcePatternResolver()第二步:GenericApplicationContext(),初始化beanFactory
  @ImportResource
  注册解析@Required 注解的处理器
  注册AutoWired注解解析器的bean定义信息AutowiredAnnotationBeanPostProcessor
  processConfigBeanDefinitions
  注册bean定义信息
  检查是否支持jpa,若支持注册解析jpa规范的注解
   
 
 
 
 
  0 条评论
 下一页
  
   
   
   
  
  
  
  
  
  
  
  
 