Spring源码
2020-05-13 14:30:08   2  举报             
     
         
 Spring源码图
    作者其他创作
 大纲/内容
 BeanDefinitionRegistry注册器
    BeanPostProcessor
  解释
  ClassPathBeanDefinitionScanner扫描器
  继承
  AnnotatedBeanDefinitionReaderbeanDefinition读取器,解析加了注解的类,然后转换成beanDefinition
  第三步:循环处理postProcessBeanDefinitionRegistry
  后置处理器
  加了@Configuration注解会生成cglib代理,会进入ConfigurationClassEnhancer中完成cglib代理,不加就不实现
  第三种情况:实现ImportBeanDefinitionRegistrar接口
  List集合中BeanPostProcessor后置处理器
  下面有很多实现了该接口的后置处理器,所以要把需要的注册进去
  invokeBeanFactoryPostProcessor方法
  通过registerAnnotationConfigProcessors()注册6个对象
  接口ImportSelector
  String[] selectImports(AnnotationMetadata importingClassMetadata);
  接口BeanDefinitionRegistryPostProcessor
  void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry);插手bean实例化过程,实例化前做一些事情
  ImportBeanDefinitionRegistrar
  读取器和扫描器完成后最后调用refresh()方法初始化Spring
  BeanDefinition
  BeanPostProcessor插手Bean实例化,通过invokeBeanFactoryPostProcessors执行
  是一个内部类,在ConfigurationClassPostProcessor里
  beanDefinitionMap
  beanDefinitionHodler就是一个map方便传参
  registerBeanDefinitions方法可以得到BeanDefinitionRegistry,所以可以动态的添加BeanDefinition,也可以改变BeanDefinition,我们自己添加
  类ConfigurationClassPostProcessor
  这个类就是用来在bean实例化之前处理一些事情
  很多重要的方法
  ClassPathBeanDefinitionScanner:扫描包或类,但是这里的并不做这些事,它只是扫描程序员自己手动调用scan()方法时才用到,正在的扫描包或类都是spring内部自己new的一个ClassPathBeanDefinitionScanner
  子类
  ConfigurationClassParser:解析各个配置类,会放到set集合中,防止多个配置类重复
  通过registerPostProcessor方法把ConfigurationClassPostProcessor注册进
  维护了很多重要的对象
  SpringAOP
  BeanPostProcessor后置处理器,插手bean实例化过程,实例化后,没有放到spring的bean容器之前
  ImportSelector
  那么返回的这个类是什么时候放入BeanDefinitionMap中的呢?
  AnnotatedBeanDefinitionReader
  ImportAwareBeanPostProcessor
  扫描得到所有的@Component的BeanDefinition
  AnnotatedBeanDefinition用来描述加了注解的类
  通过BeanDefinitionRegistry的registerBeanDefinition方法 put进beanDefinitionMap 
  7个放入List中
  invokeBeanDefinitionRegistryPostProcessor方法
  它的方法
  首先在父类中创建一个工厂DefaultListableBeanFactory
  第一种情况:普通类,加了@Component注解的类
  第一步:得到用户自定义的BeanDefinitionRegistryPostProcessor
  接口ImportBeanDefinitionRegistrar
  可以动态调用某个类,就是一个开关,就是有些你自己写的类,可能只用到过一次,做个判断开启调用,AOP就是这样实现的
  BeanDefinitionRegistryPostProcessor后置处理器,在BeanFactoryPostProcessor之前执行,因为源码中先遍历的BeanDefinitionRegistryPostProcessor(有内部的和自定义的)自定义的先执行,自定义的就是自己手动调用addBeanFactoryPostProcessor方法添加的
  BeanDefinitionRegistryPostProcessor
  spring扩展之一,实现这个接口可以动态的往beanDefinitionMap中添加一个bean,可以干预实例化过程,@MapperScan:底层就是把接口变成对象,并且在Spring当中,底层就是实现了ImportBeanDefinitionRegistrar
  ApplicationListenerDetector
  应用场景
  BeanFactoryPostProcessor后置处理器,在spring的bean容器中任意一个bean没有被new出来之前
  BeanFactoryPostProcessor
  生成的cglib代理对象会实现EnhancedConfiguration接口,这个接口又继承了BeanFactoryAware接口,这个接口中的 setBeanFactory()方法可以直接获得beanFactory,这样就可以放入BeanDefinition中了
  如果b()方法调用了a();那是不是又new了一个A对象,显然不符合bean的单例形式,所以需要cglib代理,当执行到b()方法时,代理类会先判断这个A类是不是第一次new,如果是则代理对象通过proxy.invokeSuper()调用父类的当前方法new出对象,否则就通过$$BeanFacotory.getBean()方法得到该对象,这样就不会产生多例的情况了
  第二种情况:@Import(xxx.class)直接把xxx.class拿出来进行解析,如果xxx.class中是实现了ImportSelector接口的类,就会调用其中的selectImports()方法,返回一个字符串(类名)
  就是ConfigurationClassPostProcessor
  为什么要生成cglib代理呢?
  BeanPostProcessor后置处理器
  AOP
  会通过registerBeanPostProcessors方法把需要执行的注册进List中
  beanDefinitionNames存放beanName
  Mybatis中的@MapperScan注解
  BeanPostProcessor后置处理器。spring提供的一个扩展点之一,通过实现这个接口可以插手bean实例化过程,减轻BeanFactory的负担,可以设置多个,然后依次执行,比如AOP就是在bean实例化期间把逻辑织入到bean实例中的,也正是实现了BeanPostProcessor与IOC建立了联系
  @import注解三种情况:1.普通类 2.ImportSelector 3.ImportBeanDefinitionRegistrar
  beanName
  dependencyComparator,用来排序的
  实现
  ConfigurationClassPostProcessor中的postProcessBeanFactory方法,针对加了@Configuration的配置类生产cglib动态代理
  Spring大环境
  重要
  RootBeanDefinition描述Spring内部提供的类
  第二步:得到内置的BeanDefinitionRegistryPostProcessor
  ConfigurationClassPostProcessor扫描三种@Import注解、@Bean注解、判断配置类是否完整的配置类
  开始处理BeanDefinitionRegistryPostProcessor
  通过beanDefinition的构造方法把一个类变成beanDefinition:类的描述
  这个代理对象是如何交给spring管理的呢?
  selectImports方法返回一个类名(全名),动态添加BeanDefinition,它帮你添加
  ApplicationContextPostProcessor
  处理所有的@Import
  解析加了@Configuration的类
  ConfigurationClassEnhancer类:完成cglib代理
  ClassPathBeanDefinitionScanner
  1.AnnotationAwareAspectJAutoProxyCreator处理AOP的后置处理器
  作用
  @Configuration注解加不加都会被解析,那么为什么还要加呢?
  AnnotationConfigApplicationContext
  执行所有的BeanDefinitionRegistryPostProcessor
  接口BeanFactoryPostProcessor
  开始处理BeanFactoryPostProcessor
  在ConfigurationClassPostProcessor的processConfigBeanDefinitions方法中会通过ConfigurationClassUtils.checkConfigurationClassCandidate方法检查是否加了@Configuration注解,如果加了spring会认为它是一个全注解,则为BeanDefinition设置configurationClass属性为full,且下面的注解就不在判断了@Component、@ComponentScan、@Import、@ImportResource。如果没加,spring会认为它是一个部分注解,则为BeanDefinition设置configurationClass属性为lite
   
 
 
 
 
  0 条评论
 下一页
  
   
   
   
   
  
  
  
  
  
  
  
  
 