spring 源码一

814 阅读2分钟

IOC的加载过程

首先我们一个类要去生产成一个bean不是一步到位的

1.先要将类加载成bean定义,那么加载成bean定义有几个步骤

 1.通过BeanDefinitionReader去加载我们的配置类
 2.加载完配置类后通过BeanDefinitionScanner,去扫描合格的Class(@Service...)
 3.通过BeanDefinitionRegistry把合格的Class注册成bean定义
 4.加载完成bean定义后,ApplicationContext会调用BeanFactoryPostProcessorBeanDefinitionRegistryPostProcessor的
 自定义实现类去修改或者注册我们的bean定义
 

2.通过BeanFactory(使用了简单工厂模式)

 1.实列化,通过反射
 2.填充属性解析(解析@Autowired @value)
 3.初始化,回调Aware,调用初始化结束方法
 4.初始化完成放到Map里面

一.ApplicationContext

1.BeanDefinitionReader       配置类/xml读取

2.BeanDefinitionScanner      bean扫描

3.BeanDefinitionRegistry     注册bean定义

4.BeanDefinitio              bean定义

5.BeanFactoryPostProcessor   ApplicationContext的扩展点->bean工厂的的后置处理器 

6.事件

  5.1.在BeanFactory工厂getbean之前还是可以对bean定义进行修改的
  5.2.当加载spring容器的时候,spring会调用我所有实现了这个接口的自定义类
       5.2.1.重写postProcessBeanFactory方法,参数就是个工厂,getBeanDefinitio(beanName)可以修改bean定义
       5.2.2.子接口可以注册bean定义
  5.3.一般用在spring在集成其他的框架的时候(比如集成mybatis) 
  5.4.子接口BeanDefinitionRegistryPostProcessor用来注册新的bean定义
       5.4.4.重写postProcessBeanDefinitionRegistry方法,参数是一个BeanDefinitionRegistry,可以注册bean定义

二.BeanFactory工厂(前后需要调用9次bean的后置处理器 )

1.反射实列化(反射和工厂,反射是由Spring来定义的,工厂可以自己定义,如果定义动态代理)
       @Component通过反射的方式,把类的class赋值到类定义上面,由Spring来控制
       @bean通过工厂的方式,可以自己来new 出实列,也可以自己写反射,相对灵活
       
2.填充属性 (@Autowired @value),会涉及到循环依赖

3.初始化 (initMethod destory),如果类实现了Aware,会回调Aware里的方法,初始化结束方法

4.Aop创建代理

4.放到Map<beanName,bean实列> 单列池一级缓存

循环依赖(三级缓存,就是三个map)

Ioc集成Aop