IOC的加载过程
首先我们一个类要去生产成一个bean不是一步到位的
1.先要将类加载成bean定义,那么加载成bean定义有几个步骤
1.通过BeanDefinitionReader去加载我们的配置类
2.加载完配置类后通过BeanDefinitionScanner,去扫描合格的Class(@Service...)
3.通过BeanDefinitionRegistry把合格的Class注册成bean定义
4.加载完成bean定义后,ApplicationContext会调用BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor的
自定义实现类去修改或者注册我们的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实列> 单列池一级缓存