IOC控制反转,也成为依赖注入(DI),是一个定义对象依赖的过程,对象只和 构造参数,工厂方法参数,对象实例属性或工厂方法返回相关。容器在创建这些Bean的时候注入这些依赖。这个过程是一个反向的过程,所以命名为依赖反转,对象实例的创建由其提供的构造方法或服务定位机制来实现。这样做最大的好处就是解耦。
Spring把创建Bean的工作交给BeanFactory,那么它到底是怎么创建Bean的呢?
1)加载配置,有两种方式,分别是xml文件配置和注解配置:
由ClassXmlPathApplicationContext去加载配置好的xml文件,或者由AnnotationConfigApplicationContext去加载一个JavaConfig(其实是一堆注解)得到Spring上下文ApplicationContext
2)Bean定义:
ApplicationContext会调用BeanDefinitionReader(读取所有的Bean)、BeanDefinitionScanner(扫描到合格的Bean)、BeanDefinitionRegistry(注册合格的Bean),
然后得到BeanDefinition(Bean定义)
3)BeanFactory拿到BeanDefinition后,会根据这些Bean的特性创建出所需要的Bean了
4)实例化Bean,依赖反射
5)填充属性,比如@Value、@AutoWired等
6)初始化Bean,调用initMethod等(在初始化后,会调用很多的Aware接口,比如BeanNameAware、BeanClassLoaderAware、BeanFactoryAware等)
7)放入对象池等待使用,也就是一级缓存
当然,这其中有很多步骤,没有详细列出来,比如扩展节点,在Bean定义前Spring允许我们自主去注册Bean(实现BeanDefinitionRegistryPostProcessor-Bean定义的后置处理器),
在BeanFactory创建Bean前Spring允许我们自主去修改Bean定义(实现BeanFactoryPostProcessor-BeanFactory的后置处理器)